Skip to main content

gltf_reader/
json.rs

1//! JSON types that show up in the parsed glTF structure.
2
3use core::fmt;
4
5use alloc::borrow::Cow;
6use alloc::collections::btree_map::BTreeMap;
7use alloc::string::String;
8use alloc::vec::Vec;
9use serde::Deserialize;
10use serde::de::{MapAccess, SeqAccess, Visitor};
11use serde_json::Number;
12
13/// A JSON object (i.e. a map from strings to [`Value`]s).
14#[derive(Debug, Clone, PartialEq, Eq, Default, Deserialize)]
15#[serde(transparent)]
16pub struct Object<'a>(#[serde(borrow)] pub BTreeMap<Cow<'a, str>, Value<'a>>);
17
18impl Object<'_> {
19    pub fn into_owned(self) -> Object<'static> {
20        Object(
21            self.0
22                .into_iter()
23                .map(|(k, v)| (Cow::Owned(k.into_owned()), v.into_owned()))
24                .collect(),
25        )
26    }
27}
28
29impl ownable::traits::IntoOwned for Object<'_> {
30    type Owned = Object<'static>;
31
32    fn into_owned(self) -> Self::Owned {
33        self.into_owned()
34    }
35}
36
37/// A JSON value. Unlike [`serde_json`]s `Value` type, this type can borrow from the input data
38/// instead of always copying, reducing memory usage in multiple cases.
39#[derive(Clone, PartialEq, Eq)]
40pub enum Value<'a> {
41    Null,
42    Bool(bool),
43    Number(Number),
44    String(Cow<'a, str>),
45    Array(Vec<Value<'a>>),
46    Object(Object<'a>),
47}
48
49impl fmt::Debug for Value<'_> {
50    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
51        match self {
52            Self::Null => write!(f, "null"),
53            Self::Bool(b) => b.fmt(f),
54            Self::Number(n) => n.fmt(f),
55            Self::String(s) => s.fmt(f),
56            Self::Array(a) => a.fmt(f),
57            Self::Object(o) => o.fmt(f),
58        }
59    }
60}
61
62impl Value<'_> {
63    pub fn into_owned(self) -> Value<'static> {
64        match self {
65            Self::Null => Value::Null,
66            Self::Bool(b) => Value::Bool(b),
67            Self::Number(n) => Value::Number(n),
68            Self::String(s) => Value::String(Cow::Owned(s.into_owned())),
69            Self::Array(a) => Value::Array(a.into_iter().map(|v| v.into_owned()).collect()),
70            Self::Object(o) => Value::Object(o.into_owned()),
71        }
72    }
73}
74
75impl ownable::traits::IntoOwned for Value<'_> {
76    type Owned = Value<'static>;
77
78    fn into_owned(self) -> Self::Owned {
79        self.into_owned()
80    }
81}
82
83impl<'a, 'de> serde::Deserialize<'de> for Value<'a>
84where
85    'de: 'a,
86{
87    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
88    where
89        D: serde::Deserializer<'de>,
90    {
91        struct ValueVisitor;
92
93        impl<'de> Visitor<'de> for ValueVisitor {
94            type Value = Value<'de>;
95
96            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
97                formatter.write_str("any valid JSON value")
98            }
99
100            fn visit_bool<E>(self, value: bool) -> Result<Value<'de>, E> {
101                Ok(Value::Bool(value))
102            }
103
104            fn visit_i64<E>(self, value: i64) -> Result<Value<'de>, E> {
105                Ok(Value::Number(value.into()))
106            }
107
108            fn visit_i128<E>(self, value: i128) -> Result<Value<'de>, E>
109            where
110                E: serde::de::Error,
111            {
112                let de = serde::de::value::I128Deserializer::new(value);
113                Number::deserialize(de).map(Value::Number)
114            }
115
116            fn visit_u64<E>(self, value: u64) -> Result<Value<'de>, E> {
117                Ok(Value::Number(value.into()))
118            }
119
120            fn visit_u128<E>(self, value: u128) -> Result<Value<'de>, E>
121            where
122                E: serde::de::Error,
123            {
124                let de = serde::de::value::U128Deserializer::new(value);
125                Number::deserialize(de).map(Value::Number)
126            }
127
128            fn visit_f64<E>(self, value: f64) -> Result<Value<'de>, E> {
129                Ok(Number::from_f64(value).map_or(Value::Null, Value::Number))
130            }
131
132            fn visit_str<E>(self, value: &str) -> Result<Value<'de>, E>
133            where
134                E: serde::de::Error,
135            {
136                self.visit_string(String::from(value))
137            }
138
139            fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
140            where
141                E: serde::de::Error,
142            {
143                Ok(Value::String(Cow::Borrowed(value)))
144            }
145
146            fn visit_string<E>(self, value: String) -> Result<Value<'de>, E> {
147                Ok(Value::String(Cow::Owned(value)))
148            }
149
150            fn visit_none<E>(self) -> Result<Value<'de>, E> {
151                Ok(Value::Null)
152            }
153
154            fn visit_some<D>(self, deserializer: D) -> Result<Value<'de>, D::Error>
155            where
156                D: serde::Deserializer<'de>,
157            {
158                Deserialize::deserialize(deserializer)
159            }
160
161            fn visit_unit<E>(self) -> Result<Value<'de>, E> {
162                Ok(Value::Null)
163            }
164
165            fn visit_seq<V>(self, mut visitor: V) -> Result<Value<'de>, V::Error>
166            where
167                V: SeqAccess<'de>,
168            {
169                let mut vec = Vec::new();
170                while let Some(elem) = visitor.next_element()? {
171                    vec.push(elem);
172                }
173
174                Ok(Value::Array(vec))
175            }
176
177            fn visit_map<V>(self, mut visitor: V) -> Result<Value<'de>, V::Error>
178            where
179                V: MapAccess<'de>,
180            {
181                let mut values = BTreeMap::new();
182                while let Some((key, value)) = visitor.next_entry()? {
183                    values.insert(key, value);
184                }
185
186                Ok(Value::Object(Object(values)))
187            }
188        }
189
190        deserializer.deserialize_any(ValueVisitor)
191    }
192}