mod node;
mod parse;
mod pipe;
mod render;
#[cfg(test)]
mod tests;
use std::collections::BTreeMap;
use std::fmt;
pub use node::Template;
#[derive(Debug, Clone, PartialEq)]
pub enum Value {
Str(String),
List(Vec<Value>),
Map(BTreeMap<String, Value>),
Bool(bool),
}
impl Value {
#[must_use]
pub fn map(entries: impl IntoIterator<Item = (String, Value)>) -> Value {
Value::Map(entries.into_iter().collect())
}
#[must_use]
pub fn is_truthy(&self) -> bool {
match self {
Value::Str(s) => !s.is_empty(),
Value::List(items) => items.iter().any(Value::is_truthy),
Value::Map(_) => true,
Value::Bool(b) => *b,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TemplateError {
message: String,
}
impl TemplateError {
fn new(message: impl Into<String>) -> Self {
Self {
message: message.into(),
}
}
}
impl fmt::Display for TemplateError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.message)
}
}
impl std::error::Error for TemplateError {}