mon_core/
serialization.rs

1use crate::ast::{Member, MonValue, MonValueKind};
2use serde::Serialize;
3use std::collections::BTreeMap;
4
5#[derive(Debug, Clone, PartialEq, Serialize)]
6#[serde(untagged)]
7pub enum Value {
8    String(String),
9    Number(f64),
10    Boolean(bool),
11    Null,
12    Array(Vec<Value>),
13    Object(BTreeMap<String, Value>),
14}
15
16pub(crate) fn to_value(mon_value: &MonValue) -> Value {
17    match &mon_value.kind {
18        MonValueKind::String(s) => Value::String(s.clone()),
19        MonValueKind::Number(n) => Value::Number(*n),
20        MonValueKind::Boolean(b) => Value::Boolean(*b),
21        MonValueKind::Array(arr) => Value::Array(arr.iter().map(to_value).collect()),
22        MonValueKind::Object(obj) => {
23            let mut map = BTreeMap::new();
24            for member in obj {
25                if let Member::Pair(pair) = member {
26                    // We only include pairs in the final JSON output.
27                    // Type definitions, anchors, etc., are not part of the data.
28                    map.insert(pair.key.clone(), to_value(&pair.value));
29                }
30            }
31            Value::Object(map)
32        }
33        // Aliases, Spreads, etc., should be resolved by this point.
34        // If we encounter them here, it's a logic error in the resolver.
35        MonValueKind::Null
36        | MonValueKind::Alias(_)
37        | MonValueKind::EnumValue { .. }
38        | MonValueKind::ArraySpread(_) => Value::Null, // Or panic, depending on desired strictness.
39    }
40}