diff --git a/src/bin.rs b/src/bin.rs index 1f8fcd7..d6f9f64 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -1,5 +1,6 @@ extern crate nom; +use crate::renderer::CompareContextElement; use crate::renderer::IntoBoxedContextElement; use parser::Filter; use renderer::compile_template; @@ -11,6 +12,7 @@ use renderer::RenderError; use renderer::Renderable; use renderer::WalkError; use renderer::Walkable; +use std::any::Any; use std::env; use std::fs; use std::io::{self, Read}; @@ -144,3 +146,16 @@ impl IntoBoxedContextElement for serde_json::Value { Box::new(self.clone()) } } + +impl CompareContextElement for serde_json::Value { + fn to_any(&self) -> &dyn Any { + self + } + + fn equals(&self, other: &dyn ContextElement) -> bool { + other + .to_any() + .downcast_ref::() + .map_or(false, |a| self == a) + } +} diff --git a/src/renderer/context_element.rs b/src/renderer/context_element.rs index 7c53e8f..c201d4e 100644 --- a/src/renderer/context_element.rs +++ b/src/renderer/context_element.rs @@ -5,7 +5,7 @@ use std::any::Any; use std::fmt::Debug; pub trait ContextElement: - Debug + Walkable + Renderable + Loopable + IntoBoxedContextElement + Debug + Walkable + Renderable + Loopable + IntoBoxedContextElement + CompareContextElement { } @@ -32,6 +32,8 @@ pub trait Loopable { pub trait CompareContextElement { fn to_any(&self) -> &dyn Any; + + fn equals(&self, other: &dyn ContextElement) -> bool; } pub trait IntoBoxedContextElement { diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 946f770..82a97e6 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -7,6 +7,7 @@ mod parameters_context; mod renderer; mod walking; +pub use context_element::CompareContextElement; pub use context_element::ContextElement; pub use context_element::IntoBoxedContextElement; pub use context_element::Loopable; diff --git a/src/renderer/parameters_context.rs b/src/renderer/parameters_context.rs index 5f4c6a8..6cdf05b 100644 --- a/src/renderer/parameters_context.rs +++ b/src/renderer/parameters_context.rs @@ -1,5 +1,6 @@ use crate::parser::KVPair; use crate::parser::{Filter, RValue}; +use crate::renderer::context_element::CompareContextElement; use crate::renderer::context_element::ContextElement; use crate::renderer::context_element::IntoBoxedContextElement; use crate::renderer::walking::walk_path; @@ -8,6 +9,7 @@ use crate::renderer::RenderError; use crate::renderer::Renderable; use crate::renderer::WalkError; use crate::renderer::Walkable; +use std::any::Any; use std::collections::HashMap; /// Copy the data from an RValue to an Owned struct @@ -146,3 +148,16 @@ impl IntoBoxedContextElement for String { Box::new(self.clone()) } } + +impl CompareContextElement for String { + fn to_any(&self) -> &dyn Any { + self + } + + fn equals(&self, other: &dyn ContextElement) -> bool { + other + .to_any() + .downcast_ref::() + .map_or(false, |a| self == a) + } +} diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index 76e6317..4f39135 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -245,6 +245,9 @@ impl<'a> DustRenderer<'a> { RValue::RVPath(path) => walk_path(breadcrumbs, &path.keys), }, }; + if left_side.unwrap().equals(right_side.unwrap()) { + panic!("testing"); + } // let x = WalkError::CantWalk; // let y = WalkError::CantWalk; // if x == y {