archival/object/
to_liquid.rs1use 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}