From d24e9f037fdb86bd9f3618e1e95dfcf2e7741f12 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 24 Apr 2021 17:37:04 +0200 Subject: Make Backend need Copy, so we can pass it around Signed-off-by: Matthias Beyer --- src/backend/dialoguer.rs | 1 + src/backend/mod.rs | 2 +- src/buildable.rs | 6 +++--- tests/common/mod.rs | 2 ++ 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>; fn u8_builder(&self) -> Box>; fn u16_builder(&self) -> Box>; 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(backend: B) -> Box> - where B: Backend; + where B: 'static + Backend; } impl BuildableCollection for Vec where T: 'static + BuildableValue, { fn builder(backend: B) -> Box> - where B: Backend + where B: 'static + Backend { backend.vec_builder::() } @@ -164,7 +164,7 @@ impl BuildableCollection for Option where T: 'static + BuildableValue + Sized, { fn builder(backend: B) -> Box>> - 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> { 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(_backend: B) -> Box> - where B: Backend + fn builder(backend: B) -> Box> + where B: 'static + Backend { - Box::new(ConfigStructBuilder) + Box::new(ConfigStructBuilder(backend.clone())) } } -pub struct ConfigStructBuilder; -impl CollectionBuilder for ConfigStructBuilder { +pub struct ConfigStructBuilder(B); +impl CollectionBuilder for ConfigStructBuilder { type Output = Configuration; fn build_collection(&self, value_desc: &str) -> Result { println!("Building {}", value_desc); - let verbose = bool::builder(DummyBackend).build_value(value_desc)?; - let values = Vec::::builder(DummyBackend).build_collection(value_desc)?; + let verbose = bool::builder(self.0).build_value(value_desc)?; + let values = Vec::::builder(self.0).build_collection(value_desc)?; Ok(Configuration { verbose, -- cgit v1.2.3