1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use liquid_core::Result;
use liquid_core::Runtime;
use liquid_core::Value;
use liquid_core::ValueView;
use liquid_core::{Display_filter, Filter, FilterReflection, ParseFilter};

#[derive(Debug, Default, Display_filter)]
#[name = "size"]
pub struct SizeFilter;

impl Filter for SizeFilter {
    fn evaluate(&self, input: &dyn ValueView, _runtime: &dyn Runtime) -> Result<Value> {
        if let Some(x) = input.as_scalar() {
            Ok(Value::scalar(x.to_kstr().len() as i64))
        } else if let Some(x) = input.as_array() {
            Ok(Value::scalar(x.size()))
        } else if let Some(x) = input.as_object() {
            Ok(Value::scalar(x.size()))
        } else {
            Ok(Value::scalar(0i64))
        }
    }
}

#[derive(Clone, ParseFilter, FilterReflection)]
#[filter(name = "size", description = "tests helper", parsed(SizeFilter))]
pub struct SizeFilterParser;