diff --git a/src/bin.rs b/src/bin.rs index 12e1bd3..1f8fcd7 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -1,5 +1,6 @@ extern crate nom; +use crate::renderer::IntoBoxedContextElement; use parser::Filter; use renderer::compile_template; use renderer::CompiledTemplate; @@ -137,3 +138,9 @@ impl Loopable for serde_json::Value { } } } + +impl IntoBoxedContextElement for serde_json::Value { + fn clone_to_box(&self) -> Box { + Box::new(self.clone()) + } +} diff --git a/src/renderer/context_element.rs b/src/renderer/context_element.rs index 4440e31..7c53e8f 100644 --- a/src/renderer/context_element.rs +++ b/src/renderer/context_element.rs @@ -35,13 +35,7 @@ pub trait CompareContextElement { } pub trait IntoBoxedContextElement { - fn to_box(self) -> Box; -} - -impl IntoBoxedContextElement for C { - fn to_box(self) -> Box { - Box::new(self) - } + fn clone_to_box(&self) -> Box; } // impl PartialEq for dyn ContextElement { diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 70f423b..946f770 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -8,6 +8,7 @@ mod renderer; mod walking; pub use context_element::ContextElement; +pub use context_element::IntoBoxedContextElement; pub use context_element::Loopable; pub use context_element::Renderable; pub use context_element::Walkable; diff --git a/src/renderer/parameters_context.rs b/src/renderer/parameters_context.rs index f69314d..5f4c6a8 100644 --- a/src/renderer/parameters_context.rs +++ b/src/renderer/parameters_context.rs @@ -55,22 +55,12 @@ impl NewParametersContext { .iter() .map(|kvpair| (kvpair.key.to_string(), OwnedRValue::from(&kvpair.value))) .collect(); - - let x: String = "foo".to_owned(); - let y: &dyn ContextElement = &x as _; - let z: Box = y.clone().to_box(); - // let owned_y: Box = Box::new(*y.clone()); - // unsafe { - // let ce = &mut *y.clone() as *mut dyn ContextElement; - // Box::from_raw(ce); - // } - - // let owned_breadcrumbs: Vec> = - // breadcrumbs.iter().map(|ce| Box::new(*ce.clone())).collect(); + let owned_breadcrumbs: Vec> = + breadcrumbs.iter().map(|ce| ce.clone_to_box()).collect(); NewParametersContext { params: owned_params, - breadcrumbs: Vec::new(), + breadcrumbs: owned_breadcrumbs, } } } @@ -150,3 +140,9 @@ impl Walkable for String { Err(WalkError::CantWalk) } } + +impl IntoBoxedContextElement for String { + fn clone_to_box(&self) -> Box { + Box::new(self.clone()) + } +}