diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2021-04-24 17:37:04 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2021-04-24 17:50:06 +0200 |
commit | d24e9f037fdb86bd9f3618e1e95dfcf2e7741f12 (patch) | |
tree | eb99489953ae4a6b9004b3ede5ce0e55654e3268 | |
parent | 3996673b3cd198c7e80bfa51d13b2b771657d32a (diff) |
Make Backend need Copy, so we can pass it around
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | src/backend/dialoguer.rs | 1 | ||||
-rw-r--r-- | src/backend/mod.rs | 2 | ||||
-rw-r--r-- | src/buildable.rs | 6 | ||||
-rw-r--r-- | tests/common/mod.rs | 2 | ||||
-rw-r--r-- | tests/struct.rs | 14 |
5 files changed, 14 insertions, 11 deletions
diff --git a/src/backend/dialoguer.rs b/src/backend/dialoguer.rs index 6b08507..564750f 100644 --- a/src/backend/dialoguer.rs +++ b/src/backend/dialoguer.rs @@ -5,6 +5,7 @@ use crate::BuildableCollection; use crate::CollectionBuilder; use crate::ValueBuilder; +#[derive(Copy, Clone)] pub struct DialoguerBackend; impl Backend for DialoguerBackend { diff --git a/src/backend/mod.rs b/src/backend/mod.rs index bd5bc58..757703c 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -6,7 +6,7 @@ use crate::CollectionBuilder; use crate::ValueBuilder; /// A backend can be used to get builders for specific types -pub trait Backend { +pub trait Backend: Copy { fn bool_builder(&self) -> Box<dyn ValueBuilder<Output = bool>>; fn u8_builder(&self) -> Box<dyn ValueBuilder<Output = u8>>; fn u16_builder(&self) -> Box<dyn ValueBuilder<Output = u16>>; diff --git a/src/buildable.rs b/src/buildable.rs index 54e7bbe..0436456 100644 --- a/src/buildable.rs +++ b/src/buildable.rs @@ -147,14 +147,14 @@ impl BuildableValue for String { pub trait BuildableCollection { fn builder<B>(backend: B) -> Box<dyn CollectionBuilder<Output = Self>> - where B: Backend; + where B: 'static + Backend; } impl<T> BuildableCollection for Vec<T> where T: 'static + BuildableValue, { fn builder<B>(backend: B) -> Box<dyn CollectionBuilder<Output = Self>> - where B: Backend + where B: 'static + Backend { backend.vec_builder::<T>() } @@ -164,7 +164,7 @@ impl<T> BuildableCollection for Option<T> where T: 'static + BuildableValue + Sized, { fn builder<B>(backend: B) -> Box<dyn CollectionBuilder<Output = Option<T>>> - where B: Backend + where B: 'static + Backend { backend.option_builder() } diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 26e0066..0ab668a 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -1,6 +1,8 @@ use interactive_object_builder::*; +#[derive(Copy, Clone)] pub struct DummyBackend; + impl Backend for DummyBackend { fn bool_builder(&self) -> Box<dyn ValueBuilder<Output = bool>> { Box::new(BoolValBuilder) diff --git a/tests/struct.rs b/tests/struct.rs index 415c2dc..9845278 100644 --- a/tests/struct.rs +++ b/tests/struct.rs @@ -9,22 +9,22 @@ pub struct Configuration { } impl BuildableCollection for Configuration { - fn builder<B>(_backend: B) -> Box<dyn CollectionBuilder<Output = Self>> - where B: Backend + fn builder<B>(backend: B) -> Box<dyn CollectionBuilder<Output = Self>> + where B: 'static + Backend { - Box::new(ConfigStructBuilder) + Box::new(ConfigStructBuilder(backend.clone())) } } -pub struct ConfigStructBuilder; -impl CollectionBuilder for ConfigStructBuilder { +pub struct ConfigStructBuilder<B: Backend>(B); +impl<B: 'static + Backend> CollectionBuilder for ConfigStructBuilder<B> { type Output = Configuration; fn build_collection(&self, value_desc: &str) -> Result<Self::Output> { println!("Building {}", value_desc); - let verbose = bool::builder(DummyBackend).build_value(value_desc)?; - let values = Vec::<u8>::builder(DummyBackend).build_collection(value_desc)?; + let verbose = bool::builder(self.0).build_value(value_desc)?; + let values = Vec::<u8>::builder(self.0).build_collection(value_desc)?; Ok(Configuration { verbose, |