Add a Loopable trait for dust sections.

This commit is contained in:
Tom Alexander
2020-04-28 19:34:52 -04:00
parent c961cf7ab8
commit e5c4ba8c82
4 changed files with 72 additions and 1 deletions

View File

@@ -5,6 +5,7 @@ use renderer::compile_template;
use renderer::CompiledTemplate;
use renderer::ContextElement;
use renderer::DustRenderer;
use renderer::Loopable;
use renderer::RenderError;
use renderer::Renderable;
use renderer::Walkable;
@@ -123,3 +124,34 @@ impl Walkable for serde_json::Value {
}
}
}
impl Loopable for serde_json::Value {
fn get_loop_elements(&self) -> Result<Vec<&dyn ContextElement>, RenderError> {
match self {
serde_json::Value::Null => Ok(Vec::new()),
serde_json::Value::Bool(boolean) => {
if *boolean {
Ok(vec![self])
} else {
Ok(Vec::new())
}
}
serde_json::Value::Number(_num) => Ok(vec![self]),
serde_json::Value::String(string_value) => {
if string_value.is_empty() {
Ok(Vec::new())
} else {
Ok(vec![self])
}
}
serde_json::Value::Array(array_value) => {
if array_value.is_empty() {
Ok(Vec::new())
} else {
Ok(array_value.iter().map(|x| x as _).collect())
}
}
serde_json::Value::Object(_obj) => Ok(vec![self]),
}
}
}