Skip to main content

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}