use gtmpl_value::{FuncError, Value};
pub fn default(args: &[Value]) -> Result<Value, FuncError> {
if args.len() != 2 {
return Err(FuncError::ExactlyXArgs("default".into(), 2));
}
if is_empty(&args[1]) {
Ok(args[0].clone())
} else {
Ok(args[1].clone())
}
}
fn is_empty(val: &Value) -> bool {
match *val {
Value::String(ref s) => s.is_empty(),
Value::Array(ref a) => a.is_empty(),
Value::Bool(ref b) => !b,
Value::Function(_) => false,
Value::Nil | Value::NoValue => true,
Value::Object(ref o) | Value::Map(ref o) => o.is_empty(),
Value::Number(ref n) => {
if let Some(u) = n.as_u64() {
u == 0
} else {
false
}
}
}
}
#[cfg(test)]
mod test {
use super::*;
use gtmpl_value::Value;
#[test]
fn test_default() {
test_fn!(default, vval!("foo", ""), "foo");
}
}