summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2021-04-24 17:37:04 +0200
committerMatthias Beyer <mail@beyermatthias.de>2021-04-24 17:50:06 +0200
commitd24e9f037fdb86bd9f3618e1e95dfcf2e7741f12 (patch)
treeeb99489953ae4a6b9004b3ede5ce0e55654e3268
parent3996673b3cd198c7e80bfa51d13b2b771657d32a (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.rs1
-rw-r--r--src/backend/mod.rs2
-rw-r--r--src/buildable.rs6
-rw-r--r--tests/common/mod.rs2
-rw-r--r--tests/struct.rs14
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,