summaryrefslogtreecommitdiffstats
path: root/src/backend/dialoguer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/dialoguer.rs')
-rw-r--r--src/backend/dialoguer.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/backend/dialoguer.rs b/src/backend/dialoguer.rs
index 6689250..11d5349 100644
--- a/src/backend/dialoguer.rs
+++ b/src/backend/dialoguer.rs
@@ -1,5 +1,7 @@
use crate::Backend;
use crate::ValueBuilder;
+use crate::BuildableValue;
+use crate::CollectionBuilder;
pub struct DialoguerBackend;
@@ -80,6 +82,12 @@ impl Backend for DialoguerBackend {
Box::new(DialoguerValueBuilder::<String>(std::marker::PhantomData))
}
+ fn vec_builder<T>(&self) -> Box<dyn CollectionBuilder<Output = Vec<T>, Error = Self::Error>>
+ where T: 'static + BuildableValue
+ {
+ Box::new(DialoguerVecBuilder::<T>(std::marker::PhantomData))
+ }
+
}
pub struct DialoguerValueBuilder<T: Sized>(std::marker::PhantomData<T>);
@@ -99,3 +107,26 @@ impl<T> ValueBuilder for DialoguerValueBuilder<T>
}
+pub struct DialoguerVecBuilder<T: 'static + BuildableValue>(std::marker::PhantomData<T>);
+impl<T> CollectionBuilder for DialoguerVecBuilder<T>
+ where T: 'static + BuildableValue
+{
+ type Output = Vec<T>;
+ type Error = DialoguerBackendError;
+
+ fn build_collection(&self, value_desc: &str) -> Result<Self::Output, Self::Error> {
+ let mut buf = vec![];
+
+ loop {
+ let v: T = T::builder(DialoguerBackend).build_value(value_desc)?;
+ buf.push(v);
+
+ if !dialoguer::Input::<bool>::new().with_prompt("Another one?").interact_text()? {
+ break
+ }
+ }
+
+ Ok(buf)
+ }
+}
+