diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-04-24 13:30:22 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-04-24 13:30:22 +0200 |
commit | 2987c24a46f3895afd85edd5f3c262776e7fa47e (patch) | |
tree | d368de1354d41579372fd12fdc87ca22f2cb54c5 /src/backend/dialoguer.rs | |
parent | a834f3c5eb10de3dbc1fb51d017cbee4483830ff (diff) | |
parent | 053a8eb004a2d44505233bf37d7e8e85a0a2f1ce (diff) |
Merge branch 'vec-example'
Diffstat (limited to 'src/backend/dialoguer.rs')
-rw-r--r-- | src/backend/dialoguer.rs | 31 |
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) + } +} + |