deser_value/convert.rs
1use std::sync::Arc;
2
3use deser_core::Text;
4use deser_core::de::{self, Deserialize, DeserializeDriver};
5use deser_core::ser::{self, Serialize, SerializeDriver};
6use deser_core::{Atom, ContainerShape, Error, ErrorKind, Event, Source};
7
8use crate::value::{Kind, Value};
9
10/// Deserializes types from a [`Value`].
11///
12/// This is a [`Deserializer`](deser_core::de::Deserializer) which emits the
13/// events of a value. It's what
14/// [`from_value`] uses, use it directly to configure the deserialization,
15/// for instance to add layers:
16///
17/// ```
18/// use std::collections::BTreeMap;
19/// use deser_path::{Path, PathLayer};
20/// use deser_value::{value, Deserializer};
21///
22/// let value = value!({"items": [1, "two"]});
23/// let err = Deserializer::new(&value)
24/// .deserialize_with::<BTreeMap<String, Vec<u32>>, _>(|driver| {
25/// driver.push_layer(PathLayer::new());
26/// })
27/// .unwrap_err();
28/// assert_eq!(err.attachment::<Path>().unwrap().to_string(), "items[1]");
29/// ```
30///
31/// Strings and bytes are passed on borrowed from the value, which means
32/// that types like `&str` can be deserialized. The [meta data](crate::Meta)
33/// of the values is restored for every event: event data is attached and if
34/// the value has spans, the input ranges and the source are published.
35/// This means that errors refer to the location in the input the value was
36/// deserialized from.
37pub struct Deserializer<'a> {
38 value: &'a Value,
39}
40
41impl<'a> Deserializer<'a> {
42 /// Creates a deserializer for a value.
43 pub fn new(value: &'a Value) -> Deserializer<'a> {
44 Deserializer { value }
45 }
46
47 /// Deserializes the value.
48 pub fn deserialize<T: Deserialize<'a>>(&mut self) -> Result<T, Error> {
49 de::Deserializer::deserialize(self)
50 }
51
52 /// Deserializes the value with a configured driver.
53 ///
54 /// The callback is invoked with the driver before the value is
55 /// deserialized, for instance to add [`Layer`](deser_core::de::Layer)s.
56 pub fn deserialize_with<T, F>(&mut self, setup: F) -> Result<T, Error>
57 where
58 T: Deserialize<'a>,
59 F: FnOnce(&mut DeserializeDriver<'_, 'a>),
60 {
61 de::Deserializer::deserialize_with(self, setup)
62 }
63}
64
65impl<'de> de::Deserializer<'de> for Deserializer<'de> {
66 fn drive(&mut self, driver: &mut DeserializeDriver<'_, 'de>) -> Result<(), Error> {
67 let mut source = None;
68 drive(self.value, driver, &mut source).map_err(|err| match source {
69 Some(source) => err.resolve_position(source.as_bytes()),
70 None => err,
71 })
72 }
73}
74
75/// A map or sequence whose values are emitted.
76enum Frame<'a> {
77 Seq(std::slice::Iter<'a, Value>, &'a Value),
78 Map(MapFrame<'a>, &'a Value),
79}
80
81/// A map whose entries are emitted.
82struct MapFrame<'a> {
83 iter: indexmap::map::Iter<'a, Value, Value>,
84 // the value of the key that was emitted
85 pending: Option<&'a Value>,
86 // the key and the remaining values of a repeated key of a multimap
87 repeated: Option<(&'a Value, std::slice::Iter<'a, Value>)>,
88 multimap: bool,
89}
90
91impl<'a> MapFrame<'a> {
92 /// Returns the next key or value.
93 fn next(&mut self) -> Option<&'a Value> {
94 if let Some(value) = self.pending.take() {
95 return Some(value);
96 }
97 if let Some((key, ref mut values)) = self.repeated {
98 if let Some(value) = values.next() {
99 self.pending = Some(value);
100 return Some(key);
101 }
102 self.repeated = None;
103 }
104 let (key, value) = self.iter.next()?;
105 // the values of a repeated key are the values of the key given
106 // more than once
107 if self.multimap
108 && let Some(seq) = value.as_seq()
109 && seq.is_repeated()
110 && !seq.is_empty()
111 {
112 let mut values = seq.iter();
113 self.pending = values.next();
114 self.repeated = Some((key, values));
115 } else {
116 self.pending = Some(value);
117 }
118 Some(key)
119 }
120}
121
122/// Publishes the input range and the source of an event.
123fn set_range<'de>(
124 driver: &mut DeserializeDriver<'_, 'de>,
125 current: &mut Option<&'de Arc<str>>,
126 new: &'de Arc<str>,
127 (start, end): (usize, usize),
128) {
129 if !current.is_some_and(|current| Arc::ptr_eq(current, new)) {
130 Source::set(driver.state_mut(), new.clone());
131 *current = Some(new);
132 }
133 driver.state_mut().set_input_range(start, end);
134}
135
136fn drive<'de>(
137 root: &'de Value,
138 driver: &mut DeserializeDriver<'_, 'de>,
139 source: &mut Option<&'de Arc<str>>,
140) -> Result<(), Error> {
141 let mut stack: Vec<Frame<'de>> = Vec::new();
142 let mut next = Some(root);
143 loop {
144 if let Some(value) = next.take() {
145 if let Some(ref meta) = value.meta {
146 if !meta.event_data().is_empty() {
147 driver.state_mut().attach_event_data(meta.event_data());
148 }
149 if let Some(span) = meta.span() {
150 set_range(driver, source, span.source(), span.start_range());
151 }
152 }
153 match value.kind {
154 Kind::Seq(ref seq) => {
155 driver.emit(Event::SeqStart(shape(seq.len(), seq.order())))?;
156 stack.push(Frame::Seq(seq.iter(), value));
157 }
158 Kind::Map(ref map) => {
159 let mut map_shape = shape(map.len(), map.order());
160 if map.is_multimap() {
161 // the entries include the values of repeated keys
162 map_shape = ContainerShape::new()
163 .with_order(map.order())
164 .with_multimap(true);
165 }
166 driver.emit(Event::MapStart(map_shape))?;
167 stack.push(Frame::Map(
168 MapFrame {
169 iter: map.inner.entries.iter(),
170 pending: None,
171 repeated: None,
172 multimap: map.is_multimap(),
173 },
174 value,
175 ));
176 }
177 ref leaf => driver.emit_borrowed(leaf_atom(leaf))?,
178 }
179 }
180
181 let Some(frame) = stack.last_mut() else {
182 return Ok(());
183 };
184 next = match frame {
185 Frame::Seq(iter, _) => iter.next(),
186 Frame::Map(map, _) => map.next(),
187 };
188 if next.is_none() {
189 let (container, event) = match stack.pop() {
190 Some(Frame::Seq(_, container)) => (container, Event::SeqEnd),
191 Some(Frame::Map(_, container)) => (container, Event::MapEnd),
192 None => unreachable!(),
193 };
194 if let Some(span) = container.span()
195 && let Some(range) = span.end_range()
196 {
197 set_range(driver, source, span.source(), range);
198 }
199 driver.emit(event)?;
200 }
201 }
202}
203
204fn shape(len: usize, order: deser_core::Order) -> ContainerShape {
205 ContainerShape::new().with_len(len).with_order(order)
206}
207
208/// Returns the atom of a value without children.
209fn leaf_atom(kind: &Kind) -> Atom<'_> {
210 match kind {
211 Kind::Null => Atom::Null,
212 Kind::Bool(value) => Atom::Bool(*value),
213 Kind::U64(value) => Atom::U64(*value),
214 Kind::I64(value) => Atom::I64(*value),
215 Kind::F32(value) => Atom::F32(*value),
216 Kind::F64(value) => Atom::F64(*value),
217 Kind::Char(value) => Atom::Char(*value),
218 Kind::Str(value) => Atom::Str(Text::borrowed(value)),
219 Kind::Lexical(value) => Atom::Lexical(Text::borrowed(value)),
220 Kind::Bytes(value) => Atom::Bytes(value.as_borrowed()),
221 Kind::Ext(value) => Atom::Ext(value.as_borrowed()),
222 Kind::Implicit(value) => Atom::Implicit(value.as_borrowed()),
223 Kind::Seq(_) | Kind::Map(_) => unreachable!("containers are not atoms"),
224 }
225}
226
227/// Deserializes a type from a value.
228///
229/// Types can borrow strings and bytes from the value.
230///
231/// ```
232/// use deser::Deserialize;
233/// use deser_value::{from_value, value};
234///
235/// #[derive(Debug, Deserialize)]
236/// struct User<'a> {
237/// name: &'a str,
238/// id: u64,
239/// }
240///
241/// let value = value!({"name": "Jane", "id": 42});
242/// let user: User = from_value(&value).unwrap();
243/// assert_eq!(user.name, "Jane");
244/// ```
245///
246/// To configure the deserialization use the [`Deserializer`].
247pub fn from_value<'de, T: Deserialize<'de>>(value: &'de Value) -> Result<T, Error> {
248 Deserializer::new(value).deserialize()
249}
250
251/// Serializes a value into a [`Value`].
252///
253/// The [event data](deser_core::State::event) of the serialized values (such
254/// as formatting hints) is captured in the [meta data](crate::Meta) of the
255/// values.
256///
257/// ```
258/// use std::collections::BTreeMap;
259/// use deser::Order;
260/// use deser_value::{to_value, value};
261///
262/// let map = BTreeMap::from([("b", 2), ("a", 1)]);
263/// let value = to_value(&map).unwrap();
264/// assert_eq!(value, value!({"a": 1, "b": 2}));
265/// assert_eq!(value.as_map().unwrap().order(), Order::Sorted);
266/// ```
267///
268/// To configure the serialization use the [`Serializer`].
269pub fn to_value<T: Serialize>(value: &T) -> Result<Value, Error> {
270 let mut serializer = Serializer::new();
271 serializer.serialize(value)?;
272 Ok(serializer.finish().pop().expect("a value was serialized"))
273}
274
275/// Serializes values into [`Value`]s.
276///
277/// This is a [`Serializer`](deser_core::ser::Serializer) which builds a value
278/// from the events of a serialized value. It's what [`to_value`] uses, use
279/// it directly to configure the serialization, for instance to add layers.
280/// Every call to [`serialize`](Self::serialize) adds a value:
281///
282/// ```
283/// use deser::ser::{Layer, Next};
284/// use deser::{Atom, Error, Event};
285/// use deser_value::{Serializer, value};
286///
287/// /// Writes all numbers as strings.
288/// struct NumbersAsStrings;
289///
290/// impl Layer for NumbersAsStrings {
291/// fn event(
292/// &mut self,
293/// event: Event<'_>,
294/// next: &mut Next<'_>,
295/// ) -> Result<(), Error> {
296/// match event {
297/// Event::Atom(Atom::U64(value)) => {
298/// next.emit(value.to_string().into())
299/// }
300/// event => next.emit(event),
301/// }
302/// }
303/// }
304///
305/// let mut serializer = Serializer::new();
306/// serializer.serialize(&true).unwrap();
307/// serializer
308/// .serialize_with(&vec![1u64, 2], |driver| {
309/// driver.push_layer(NumbersAsStrings)
310/// })
311/// .unwrap();
312/// assert_eq!(serializer.finish(), [value!(true), value!(["1", "2"])]);
313/// ```
314///
315/// The [event data](deser_core::State::event) of the serialized values (such as
316/// formatting hints) is captured in the [meta data](crate::Meta) of the
317/// values.
318#[derive(Debug, Default, Clone)]
319pub struct Serializer {
320 values: Vec<Value>,
321}
322
323impl Serializer {
324 /// Creates a serializer.
325 pub fn new() -> Serializer {
326 Serializer::default()
327 }
328
329 /// Serializes a value.
330 ///
331 /// If the value fails to serialize, nothing is added.
332 pub fn serialize(&mut self, value: &dyn Serialize) -> Result<(), Error> {
333 ser::Serializer::serialize(self, value)
334 }
335
336 /// Serializes a value with a configured driver.
337 ///
338 /// The callback is invoked with the driver before the value is
339 /// serialized, for instance to add [`Layer`](deser_core::ser::Layer)s.
340 pub fn serialize_with<F>(&mut self, value: &dyn Serialize, setup: F) -> Result<(), Error>
341 where
342 F: FnOnce(&mut SerializeDriver<'_>),
343 {
344 ser::Serializer::serialize_with(self, value, setup)
345 }
346
347 /// Returns the values serialized so far.
348 pub fn values(&self) -> &[Value] {
349 &self.values
350 }
351
352 /// Returns the values.
353 pub fn finish(self) -> Vec<Value> {
354 self.values
355 }
356}
357
358impl ser::Serializer for Serializer {
359 fn drive(&mut self, driver: &mut SerializeDriver<'_>) -> Result<(), Error> {
360 let mut out = None;
361 {
362 let mut de = DeserializeDriver::new(&mut out);
363 driver.drive(|event, state| {
364 de.state_mut()
365 .attach_event_data(&state.capture_event_data());
366 de.emit(event)
367 })?;
368 }
369 let value =
370 out.ok_or_else(|| Error::new(ErrorKind::EndOfFile, "no value was serialized"))?;
371 self.values.push(value);
372 Ok(())
373 }
374}