summaryrefslogtreecommitdiffstats
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/dialoguer.rs26
-rw-r--r--src/backend/mod.rs7
2 files changed, 29 insertions, 4 deletions
diff --git a/src/backend/dialoguer.rs b/src/backend/dialoguer.rs
index 11d5349..5bdebd6 100644
--- a/src/backend/dialoguer.rs
+++ b/src/backend/dialoguer.rs
@@ -1,7 +1,7 @@
use crate::Backend;
-use crate::ValueBuilder;
use crate::BuildableValue;
use crate::CollectionBuilder;
+use crate::ValueBuilder;
pub struct DialoguerBackend;
@@ -88,6 +88,9 @@ impl Backend for DialoguerBackend {
Box::new(DialoguerVecBuilder::<T>(std::marker::PhantomData))
}
+ fn option_builder<T: 'static + BuildableValue>(&self) -> Box<dyn CollectionBuilder<Output = Option<T>, Error = Self::Error>> {
+ Box::new(DialoguerOptionValueBuilder::<T>(std::marker::PhantomData))
+ }
}
pub struct DialoguerValueBuilder<T: Sized>(std::marker::PhantomData<T>);
@@ -106,6 +109,27 @@ impl<T> ValueBuilder for DialoguerValueBuilder<T>
}
}
+pub struct DialoguerOptionValueBuilder<T: BuildableValue>(std::marker::PhantomData<T>);
+impl<T: BuildableValue> CollectionBuilder for DialoguerOptionValueBuilder<T> {
+ type Output = Option<T>;
+ type Error = DialoguerBackendError;
+
+ fn build_collection(&self, value_desc: &str) -> Result<Self::Output, Self::Error> {
+ let q = format!("Do you want to provide a Value for {}", value_desc);
+ let b = dialoguer::Input::<bool>::new()
+ .with_prompt(q)
+ .interact_text()?;
+
+ if b {
+ T::builder(DialoguerBackend)
+ .build_value(value_desc)
+ .map(Some)
+ } else {
+ Ok(None)
+ }
+ }
+}
+
pub struct DialoguerVecBuilder<T: 'static + BuildableValue>(std::marker::PhantomData<T>);
impl<T> CollectionBuilder for DialoguerVecBuilder<T>
diff --git a/src/backend/mod.rs b/src/backend/mod.rs
index 1353a6d..3f72d66 100644
--- a/src/backend/mod.rs
+++ b/src/backend/mod.rs
@@ -1,8 +1,8 @@
pub mod dialoguer;
-use crate::ValueBuilder;
use crate::BuildableValue;
use crate::CollectionBuilder;
+use crate::ValueBuilder;
/// A backend can be used to get builders for specific types
pub trait Backend {
@@ -26,9 +26,10 @@ pub trait Backend {
fn char_builder(&self) -> Box<dyn ValueBuilder<Output = char, Error = Self::Error>>;
fn string_builder(&self) -> Box<dyn ValueBuilder<Output = String, Error = Self::Error>>;
+ fn option_builder<T: 'static + BuildableValue>(&self) -> Box<dyn CollectionBuilder<Output = Option<T>, Error = Self::Error>>;
+
fn vec_builder<T>(&self) -> Box<dyn CollectionBuilder<Output = Vec<T>, Error = Self::Error>>
- where T: 'static + BuildableValue
- ;
+ where T: 'static + BuildableValue;
}