Switch the Renderable trait over to the returning a RenderError
This commit is contained in:
@@ -14,6 +14,10 @@ pub enum RenderError<'a> {
|
||||
segment: String,
|
||||
elem: &'a dyn ContextElement,
|
||||
},
|
||||
/// Attempting to render and unrenderable type (for example, an object without any filters)
|
||||
CantRender {
|
||||
elem: &'a dyn ContextElement,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
@@ -31,6 +35,7 @@ impl fmt::Display for RenderError<'_> {
|
||||
RenderError::WontWalk { segment, elem } => {
|
||||
write!(f, "Failed to walk to {} from {:?}", segment, elem)
|
||||
}
|
||||
RenderError::CantRender { elem } => write!(f, "Cant render {:?}", elem),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -45,6 +50,7 @@ impl fmt::Debug for RenderError<'_> {
|
||||
RenderError::WontWalk { segment, elem } => {
|
||||
write!(f, "Failed to walk to {} from {:?}", segment, elem)
|
||||
}
|
||||
RenderError::CantRender { elem } => write!(f, "Cant render {:?}", elem),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
use crate::renderer::errors::RenderError;
|
||||
|
||||
pub trait Renderable {
|
||||
fn render(&self) -> String;
|
||||
fn render(&self) -> Result<String, RenderError>;
|
||||
}
|
||||
|
||||
@@ -85,10 +85,10 @@ impl<'a> DustRenderer<'a> {
|
||||
C: ContextElement,
|
||||
{
|
||||
match tag {
|
||||
DustTag::DTComment(comment) => (),
|
||||
DustTag::DTComment(_comment) => (),
|
||||
DustTag::DTReference(reference) => {
|
||||
let val = walk_path(context, &reference.path.keys)?;
|
||||
return Ok(val.render());
|
||||
return val.render();
|
||||
}
|
||||
_ => (), // TODO: Implement the rest
|
||||
}
|
||||
@@ -120,20 +120,20 @@ mod tests {
|
||||
impl<I: ContextElement> ContextElement for HashMap<&str, I> {}
|
||||
|
||||
impl Renderable for u32 {
|
||||
fn render(&self) -> std::string::String {
|
||||
self.to_string()
|
||||
fn render(&self) -> Result<String, RenderError> {
|
||||
Ok(self.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
impl Renderable for &str {
|
||||
fn render(&self) -> std::string::String {
|
||||
self.to_string()
|
||||
fn render(&self) -> Result<String, RenderError> {
|
||||
Ok(self.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
impl<I: ContextElement> Renderable for HashMap<&str, I> {
|
||||
fn render(&self) -> std::string::String {
|
||||
panic!("Attempted to render a hashmap");
|
||||
fn render(&self) -> Result<String, RenderError> {
|
||||
Err(RenderError::CantRender { elem: self })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,16 +182,23 @@ mod tests {
|
||||
.iter()
|
||||
.cloned()
|
||||
.collect();
|
||||
assert_eq!(walk_path(&context, &vec!["cat"]).unwrap().render(), "kitty");
|
||||
assert_eq!(
|
||||
walk_path(&number_context, &vec!["tiger"]).unwrap().render(),
|
||||
"3"
|
||||
walk_path(&context, &vec!["cat"]).unwrap().render().unwrap(),
|
||||
"kitty".to_owned()
|
||||
);
|
||||
assert_eq!(
|
||||
walk_path(&number_context, &vec!["tiger"])
|
||||
.unwrap()
|
||||
.render()
|
||||
.unwrap(),
|
||||
"3".to_owned()
|
||||
);
|
||||
assert_eq!(
|
||||
walk_path(&deep_context, &vec!["tiger", "food"])
|
||||
.unwrap()
|
||||
.render(),
|
||||
"people"
|
||||
.render()
|
||||
.unwrap(),
|
||||
"people".to_owned()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user