archival/object/
to_liquid.rs

1use crate::{
2    fields::{File, ObjectValues},
3    FieldConfig, FieldValue, ObjectDefinition,
4};
5use liquid::model::{KString, ObjectIndex};
6use liquid_core::{Value, ValueView};
7
8pub fn object_to_liquid(
9    object_values: &ObjectValues,
10    definition: &ObjectDefinition,
11    field_config: &FieldConfig,
12) -> liquid::model::Object {
13    let mut values: Vec<(KString, Value)> = definition
14        .fields
15        .keys()
16        .map(|k| {
17            (
18                KString::from_ref(k.as_index()),
19                object_values
20                    .get(k)
21                    .map(|v| v.to_liquid(field_config))
22                    .unwrap_or_else(|| Value::Nil),
23            )
24        })
25        .collect();
26    let mut child_values: Vec<(KString, Value)> = definition
27        .children
28        .iter()
29        .map(|(k, child_def)| {
30            (
31                KString::from_ref(k.as_index()),
32                object_values
33                    .get(k)
34                    .map(|v| v.typed_objects(child_def, field_config))
35                    .unwrap_or_else(|| Value::Array(vec![])),
36            )
37        })
38        .collect();
39    let mut meta_values: Vec<(KString, Value)> = object_values
40        .iter()
41        .filter_map(|(k, v)| {
42            if let FieldValue::Meta(meta) = v {
43                Some((KString::from_ref(k.as_index()), meta.to_liquid()))
44            } else {
45                None
46            }
47        })
48        .collect();
49    values.append(&mut meta_values);
50    values.append(&mut child_values);
51    values.into_iter().collect()
52}
53
54impl FieldValue {
55    pub fn to_liquid(&self, field_config: &FieldConfig) -> liquid::model::Value {
56        match self {
57            FieldValue::File(file) => file.to_liquid(field_config),
58            FieldValue::Oneof((t, v)) => liquid::object!({
59                "type": t,
60                "value": v.to_liquid(field_config)
61            })
62            .into(),
63            _ => self.to_value(),
64        }
65    }
66}
67
68impl File {
69    pub fn to_liquid(&self, field_config: &FieldConfig) -> liquid::model::Value {
70        let mut m = liquid::model::Object::new();
71        for (k, v) in self.clone().into_map(Some(field_config)) {
72            m.insert(k.into(), liquid::model::Value::scalar(v));
73        }
74        liquid_core::Value::Object(m)
75    }
76}