duster/src/renderer/context_element.rs
Tom Alexander c96b2257d7
Compiling.
Need to see if I can do a generic implemented of IntoBoxedContextElement for all objects implementing Copy, and I need to implement the compare code to make sure this all works before I start integrating this more.
2020-05-10 19:07:41 -04:00

46 lines
1.3 KiB
Rust

use crate::parser::Filter;
use crate::renderer::errors::RenderError;
use crate::renderer::errors::WalkError;
use std::any::Any;
use std::fmt::Debug;
pub trait ContextElement:
Debug + Walkable + Renderable + Loopable + IntoBoxedContextElement
{
}
pub trait Walkable {
fn walk(&self, segment: &str) -> Result<&dyn ContextElement, WalkError>;
}
pub trait Renderable {
fn render(&self, filters: &Vec<Filter>) -> Result<String, RenderError>;
}
pub trait Loopable {
/// Return the elements for a Dust section
///
/// Sections in dust are accomplished with the {#path} syntax. A
/// section has a truthiness check performed on it. If that
/// truthiness check fails, then it will render the
/// else-block. Otherwise if its a scalar value it will render
/// once with the context being the element at that path. Finally,
/// if its an array-like value then it will render n-times, once
/// for each element of the array.
fn get_loop_elements(&self) -> Vec<&dyn ContextElement>;
}
pub trait CompareContextElement {
fn to_any(&self) -> &dyn Any;
}
pub trait IntoBoxedContextElement {
fn clone_to_box(&self) -> Box<dyn ContextElement>;
}
// impl PartialEq<dyn ContextElement> for dyn ContextElement {
// fn eq(&self, other: &dyn ContextElement) -> bool {
// todo!()
// }
// }