From b05cb89d948a6f12abf622a5e08d589f41a26a5a Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 25 Apr 2021 15:36:03 +0200 Subject: Add support for default values Signed-off-by: Matthias Beyer --- examples/config.rs | 2 +- examples/simple.rs | 2 +- src/backend/dialoguer.rs | 18 +++++++++++------- src/value_builder.rs | 2 +- tests/bool.rs | 2 +- tests/common/mod.rs | 6 +++--- tests/struct.rs | 2 +- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/examples/config.rs b/examples/config.rs index 453b2e2..25610ff 100644 --- a/examples/config.rs +++ b/examples/config.rs @@ -22,7 +22,7 @@ impl CollectionBuilder for ConfigStructBuilder { fn build_collection(&self, value_desc: &str) -> Result { println!("Building {}", value_desc); - let verbose = bool::builder(self.0).build_value("Be verbose?")?; + let verbose = bool::builder(self.0).build_value("Be verbose?", Some(&false))?; let values = Vec::::builder(self.0).build_collection("List of values")?; Ok(Configuration { diff --git a/examples/simple.rs b/examples/simple.rs index bd406c4..a9dd6c9 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -2,7 +2,7 @@ use interactive_object_builder::*; use interactive_object_builder::backend::dialoguer::DialoguerBackend; fn main() -> Result<()> { - let b = bool::builder(DialoguerBackend).build_value("Success?")?; + let b = bool::builder(DialoguerBackend).build_value("Success?", Some(&false))?; if b { println!("Success"); diff --git a/src/backend/dialoguer.rs b/src/backend/dialoguer.rs index 564750f..53eae8d 100644 --- a/src/backend/dialoguer.rs +++ b/src/backend/dialoguer.rs @@ -101,11 +101,15 @@ impl ValueBuilder for DialoguerValueBuilder { type Output = T; - fn build_value(&self, question: &str) -> Result { - dialoguer::Input::::new() - .with_prompt(question) - .interact_text() - .map_err(crate::error::IOBError::from) + fn build_value(&self, question: &str, default: Option<&Self::Output>) -> Result { + let mut dia = dialoguer::Input::::new(); + dia.with_prompt(question); + + if let Some(def) = default { + dia.with_initial_text(def.to_string()); + } + + dia.interact_text().map_err(crate::error::IOBError::from) } } @@ -121,7 +125,7 @@ impl CollectionBuilder for DialoguerOptionValueBuilder { if b { T::builder(DialoguerBackend) - .build_value(value_desc) + .build_value(value_desc, None) .map(Some) } else { Ok(None) @@ -140,7 +144,7 @@ impl CollectionBuilder for DialoguerVecBuilder let mut buf = vec![]; loop { - let v: T = T::builder(DialoguerBackend).build_value(value_desc)?; + let v: T = T::builder(DialoguerBackend).build_value(value_desc, None)?; buf.push(v); if !dialoguer::Input::::new().with_prompt("Another one?").interact_text()? { diff --git a/src/value_builder.rs b/src/value_builder.rs index d7e045b..e450843 100644 --- a/src/value_builder.rs +++ b/src/value_builder.rs @@ -4,6 +4,6 @@ use crate::error::Result; pub trait ValueBuilder { type Output: Sized; - fn build_value(&self, question: &str) -> Result; + fn build_value(&self, question: &str, default: Option<&Self::Output>) -> Result; } diff --git a/tests/bool.rs b/tests/bool.rs index 17d23e8..d08b5b0 100644 --- a/tests/bool.rs +++ b/tests/bool.rs @@ -5,7 +5,7 @@ use interactive_object_builder::*; #[test] fn test_build_value() { - let v = bool::builder(DummyBackend).build_value("Are you sure?").unwrap(); + let v = bool::builder(DummyBackend).build_value("Are you sure?", Some(&false)).unwrap(); assert!(v); } diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 0ab668a..7e111a5 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -75,7 +75,7 @@ pub struct BoolValBuilder; impl ValueBuilder for BoolValBuilder { type Output = bool; - fn build_value(&self, _question: &str) -> Result { + fn build_value(&self, _question: &str, _default: Option<&Self::Output>) -> Result { Ok(true) } } @@ -84,7 +84,7 @@ pub struct U8ValueBuilder; impl ValueBuilder for U8ValueBuilder { type Output = u8; - fn build_value(&self, _question: &str) -> Result { + fn build_value(&self, _question: &str, _default: Option<&Self::Output>) -> Result { Ok(42) } } @@ -97,7 +97,7 @@ impl CollectionBuilder for VecBuilder { let mut buf = vec![]; loop { - let v: T = T::builder(DummyBackend).build_value(value_desc)?; + let v: T = T::builder(DummyBackend).build_value(value_desc, None)?; buf.push(v); if buf.len() == 3 { diff --git a/tests/struct.rs b/tests/struct.rs index 9845278..3a14750 100644 --- a/tests/struct.rs +++ b/tests/struct.rs @@ -23,7 +23,7 @@ impl CollectionBuilder for ConfigStructBuilder { fn build_collection(&self, value_desc: &str) -> Result { println!("Building {}", value_desc); - let verbose = bool::builder(self.0).build_value(value_desc)?; + let verbose = bool::builder(self.0).build_value(value_desc, None)?; let values = Vec::::builder(self.0).build_collection(value_desc)?; Ok(Configuration { -- cgit v1.2.3