weaver_lib/filters/
has_key.rs

1use liquid::model::KString;
2use liquid_core::{
3    Display_filter, Expression, Filter, FilterParameters, FilterReflection, FromFilterParameters,
4    ParseFilter,
5};
6use liquid_core::{Result, Runtime};
7use liquid_core::{Value, ValueView};
8
9#[derive(Clone, ParseFilter, FilterReflection)]
10#[filter(
11    name = "hasKey",
12    description = "return Default, a boolean indicating the existince of a key (regardless of value) in an object.",
13    parameters(HasKeyArgs),
14    parsed(HasKeyFilter)
15)]
16pub struct HasKey;
17
18#[derive(Debug, FilterParameters)]
19struct HasKeyArgs {
20    #[parameter(description = "The key to check for.", arg_type = "str")]
21    key: Expression,
22}
23
24#[derive(Debug, FromFilterParameters, Display_filter)]
25#[name = "hasKey"]
26struct HasKeyFilter {
27    #[parameters]
28    args: HasKeyArgs,
29}
30
31impl Filter for HasKeyFilter {
32    fn evaluate(&self, input: &dyn ValueView, runtime: &dyn Runtime) -> Result<Value> {
33        let serde_value = input.to_value();
34
35        let args = self.args.evaluate(runtime)?;
36        let key_exists = match serde_value {
37            Value::Object(map) => map.contains_key(&KString::from(args.key)),
38            _ => false,
39        };
40
41        Ok(Value::scalar(key_exists))
42    }
43}