balena_cdsl/output/serialization/
properties.rs

1use serde::ser::{Error, Serialize, SerializeMap, Serializer};
2
3use crate::dsl::schema::Schema;
4use crate::dsl::schema::SchemaList;
5use crate::output::serialization::object_types::serialize_object_type;
6use crate::output::serialization::object_types::serialize_keys_values;
7
8pub fn serialize_schema_list<O, E, S>(schema_list: &SchemaList, map: &mut S) -> Result<(), E>
9where
10    E: Error,
11    S: SerializeMap<Ok = O, Error = E>,
12{
13    map.serialize_entry("properties", &schema_list.all_as_map())?;
14
15    let required = &schema_list.required_schema_names();
16    if !required.is_empty() {
17        map.serialize_entry("required", required)?;
18    }
19
20    map.serialize_entry("$$order", &schema_list.all_names())?;
21    Ok(())
22}
23
24// FIXME: do not use trait implementation as it is hard to track where this is being called from
25impl Serialize for Schema {
26    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
27    where
28        S: Serializer,
29    {
30        let mut map = serializer.serialize_map(None)?;
31        serialize_schema(&self, &mut map)?;
32        map.end()
33    }
34}
35
36pub fn serialize_schema<O, E, S>(schema: &Schema, map: &mut S) -> Result<(), E>
37where
38    E: Error,
39    S: SerializeMap<Ok = O, Error = E>,
40{
41    serialize_object_type(&schema.object_type, map)?;
42
43    if let Some(title) = &schema.annotations.title {
44        map.serialize_entry("title", &title)?;
45    }
46
47    if let Some(children) = &schema.children {
48        serialize_schema_list(children, map)?;
49    }
50
51    if let Some(keysvalues) = &schema.dynamic {
52        serialize_keys_values(keysvalues, map)?;
53    }
54
55    if let Some(readonly) = &schema.annotations.readonly {
56        map.serialize_entry("readOnly", &readonly)?;
57    }
58
59    if let Some(writeonly) = &schema.annotations.writeonly {
60        map.serialize_entry("writeOnly", &writeonly)?;
61    }
62
63    if let Some(formula) = &schema.formula {
64        map.serialize_entry("$$formula", &formula)?;
65    }
66
67    if let Some(version) = &schema.version {
68        map.serialize_entry("$$version", &version)?;
69    }
70
71    Ok(())
72}