balena_cdsl/output/serialization/
properties.rs1use 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
24impl 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}