From 5997e80eeef113a2805de76b8fcf27d471fa3dea Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 10 Aug 2023 00:09:41 +1200 Subject: [PATCH 1/2] implement if operation --- rimu-value/src/lib.rs | 17 ++++++++ rimu/src/operations/if_.rs | 79 +++++++++++++++++++++++++++++++++++++ rimu/src/operations/let_.rs | 2 +- rimu/src/operations/mod.rs | 5 +++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 rimu/src/operations/if_.rs diff --git a/rimu-value/src/lib.rs b/rimu-value/src/lib.rs index dfb4899..bbe3e04 100644 --- a/rimu-value/src/lib.rs +++ b/rimu-value/src/lib.rs @@ -112,6 +112,23 @@ pub fn value_get_in<'a>(value: &'a Value, keys: &[&str]) -> Option<&'a Value> { } } +impl Value { + pub fn is_truthy(&self) -> bool { + match self { + Value::Null => false, + Value::Boolean(boolean) => *boolean, + Value::String(string) => string.len() > 0, + Value::Number(number) => match number { + Number::Unsigned(u) => u != &0_u64, + Number::Signed(s) => s != &0_i64, + Number::Float(f) => f != &0_f64, + }, + Value::List(list) => list.len() > 0, + Value::Object(object) => object.len() > 0, + } + } +} + #[cfg(test)] mod test { use std::{borrow::Cow, ffi::OsString, path::PathBuf}; diff --git a/rimu/src/operations/if_.rs b/rimu/src/operations/if_.rs new file mode 100644 index 0000000..0ecb12d --- /dev/null +++ b/rimu/src/operations/if_.rs @@ -0,0 +1,79 @@ +use serde::Deserialize; + +use super::Operation; +use crate::{Context, Engine, RenderError, Template, Value}; + +#[derive(Clone, Debug, PartialEq, Deserialize)] +pub struct IfOperation { + #[serde(rename = "$if")] + pub condition: Box