spacetimedb_sats/de.rs
1// Some parts copyright Serde developers under the MIT / Apache-2.0 licenses at your option.
2// See `serde` version `v1.0.169` for the parts where MIT / Apache-2.0 applies.
3
4mod impls;
5#[cfg(feature = "serde")]
6pub mod serde;
7
8#[doc(hidden)]
9pub use impls::{visit_named_product, visit_seq_product, WithBound};
10
11use crate::buffer::BufReader;
12use crate::{bsatn, i256, u256};
13use core::fmt;
14use core::marker::PhantomData;
15use smallvec::SmallVec;
16use std::borrow::Borrow;
17
18/// A data format that can deserialize any data structure supported by SATS.
19///
20/// The `Deserializer` trait in SATS performs the same function as `serde::Deserializer` in [`serde`].
21/// See the documentation of `serde::Deserializer` for more information of the data model.
22///
23/// Implementations of `Deserialize` map themselves into this data model
24/// by passing to the `Deserializer` a visitor that can receive the necessary types.
25/// The kind of visitor depends on the `deserialize_*` method.
26/// Unlike in Serde, there isn't a single monolithic `Visitor` trait,
27/// but rather, this functionality is split up into more targeted traits such as `SumVisitor<'de>`.
28///
29/// The lifetime `'de` allows us to deserialize lifetime-generic types in a zero-copy fashion.
30///
31/// [`serde`]: https://crates.io/crates/serde
32pub trait Deserializer<'de>: Sized {
33 /// The error type that can be returned if some error occurs during deserialization.
34 type Error: Error;
35
36 /// Deserializes a product value from the input.
37 fn deserialize_product<V: ProductVisitor<'de>>(self, visitor: V) -> Result<V::Output, Self::Error>;
38
39 /// Deserializes a sum value from the input.
40 ///
41 /// The entire process of deserializing a sum, starting from `deserialize(args...)`, is roughly:
42 ///
43 /// - [`deserialize`][Deserialize::deserialize] calls this method,
44 /// [`deserialize_sum(sum_visitor)`](Deserializer::deserialize_sum),
45 /// providing us with a [`sum_visitor`](SumVisitor).
46 ///
47 /// - This method calls [`sum_visitor.visit_sum(sum_access)`](SumVisitor::visit_sum),
48 /// where [`sum_access`](SumAccess) deals with extracting the tag and the variant data,
49 /// with the latter provided as [`VariantAccess`]).
50 /// The `SumVisitor` will then assemble these into the representation of a sum value
51 /// that the [`Deserialize`] implementation wants.
52 ///
53 /// - [`visit_sum`](SumVisitor::visit_sum) then calls
54 /// [`sum_access.variant(variant_visitor)`](SumAccess::variant),
55 /// and uses the provided `variant_visitor` to translate extracted variant names / tags
56 /// into something that is meaningful for `visit_sum`, e.g., an index.
57 ///
58 /// The call to `variant` will also return [`variant_access`](VariantAccess)
59 /// that can deserialize the contents of the variant.
60 ///
61 /// - Finally, after `variant` returns,
62 /// `visit_sum` deserializes the variant data using
63 /// [`variant_access.deserialize_seed(seed)`](VariantAccess::deserialize_seed)
64 /// or [`variant_access.deserialize()`](VariantAccess::deserialize).
65 /// This part may require some conditional logic depending on the identified variant.
66 ///
67 ///
68 /// The data format will also return an object ([`VariantAccess`])
69 /// that can deserialize the contents of the variant.
70 fn deserialize_sum<V: SumVisitor<'de>>(self, visitor: V) -> Result<V::Output, Self::Error>;
71
72 /// Deserializes a `bool` value from the input.
73 fn deserialize_bool(self) -> Result<bool, Self::Error>;
74
75 /// Deserializes a `u8` value from the input.
76 fn deserialize_u8(self) -> Result<u8, Self::Error>;
77
78 /// Deserializes a `u16` value from the input.
79 fn deserialize_u16(self) -> Result<u16, Self::Error>;
80
81 /// Deserializes a `u32` value from the input.
82 fn deserialize_u32(self) -> Result<u32, Self::Error>;
83
84 /// Deserializes a `u64` value from the input.
85 fn deserialize_u64(self) -> Result<u64, Self::Error>;
86
87 /// Deserializes a `u128` value from the input.
88 fn deserialize_u128(self) -> Result<u128, Self::Error>;
89
90 /// Deserializes a `u256` value from the input.
91 fn deserialize_u256(self) -> Result<u256, Self::Error>;
92
93 /// Deserializes an `i8` value from the input.
94 fn deserialize_i8(self) -> Result<i8, Self::Error>;
95
96 /// Deserializes an `i16` value from the input.
97 fn deserialize_i16(self) -> Result<i16, Self::Error>;
98
99 /// Deserializes an `i32` value from the input.
100 fn deserialize_i32(self) -> Result<i32, Self::Error>;
101
102 /// Deserializes an `i64` value from the input.
103 fn deserialize_i64(self) -> Result<i64, Self::Error>;
104
105 /// Deserializes an `i128` value from the input.
106 fn deserialize_i128(self) -> Result<i128, Self::Error>;
107
108 /// Deserializes an `i256` value from the input.
109 fn deserialize_i256(self) -> Result<i256, Self::Error>;
110
111 /// Deserializes an `f32` value from the input.
112 fn deserialize_f32(self) -> Result<f32, Self::Error>;
113
114 /// Deserializes an `f64` value from the input.
115 fn deserialize_f64(self) -> Result<f64, Self::Error>;
116
117 /// Deserializes a string-like object the input.
118 fn deserialize_str<V: SliceVisitor<'de, str>>(self, visitor: V) -> Result<V::Output, Self::Error>;
119
120 /// Deserializes an `&str` string value.
121 fn deserialize_str_slice(self) -> Result<&'de str, Self::Error> {
122 self.deserialize_str(BorrowedSliceVisitor)
123 }
124
125 /// Deserializes a byte slice-like value.
126 fn deserialize_bytes<V: SliceVisitor<'de, [u8]>>(self, visitor: V) -> Result<V::Output, Self::Error>;
127
128 /// Deserializes an array value.
129 ///
130 /// This is typically the same as [`deserialize_array_seed`](Deserializer::deserialize_array_seed)
131 /// with an uninteresting `seed` value.
132 fn deserialize_array<V: ArrayVisitor<'de, T>, T: Deserialize<'de>>(
133 self,
134 visitor: V,
135 ) -> Result<V::Output, Self::Error> {
136 self.deserialize_array_seed(visitor, PhantomData)
137 }
138
139 /// Deserializes an array value.
140 ///
141 /// The deserialization is provided with a `seed` value.
142 fn deserialize_array_seed<V: ArrayVisitor<'de, T::Output>, T: DeserializeSeed<'de> + Clone>(
143 self,
144 visitor: V,
145 seed: T,
146 ) -> Result<V::Output, Self::Error>;
147}
148
149/// The `Error` trait allows [`Deserialize`] implementations to create descriptive error messages
150/// belonging to the [`Deserializer`] against which they are currently running.
151///
152/// Every [`Deserializer`] declares an [`Error`] type
153/// that encompasses both general-purpose deserialization errors
154/// as well as errors specific to the particular deserialization format.
155///
156/// Most deserializers should only need to provide the [`Error::custom`] method
157/// and inherit the default behavior for the other methods.
158pub trait Error: Sized {
159 /// Raised when there is general error when deserializing a type.
160 fn custom(msg: impl fmt::Display) -> Self;
161
162 /// The product length was not as promised.
163 fn invalid_product_length<'de, T: ProductVisitor<'de>>(len: usize, expected: &T) -> Self {
164 Self::custom(format_args!(
165 "invalid length {}, expected {}",
166 len,
167 fmt_invalid_len(expected)
168 ))
169 }
170
171 /// There was a missing field at `index`.
172 fn missing_field<'de, T: ProductVisitor<'de>>(index: usize, field_name: Option<&str>, prod: &T) -> Self {
173 Self::custom(error_on_field("missing ", index, field_name, prod))
174 }
175
176 /// A field with `index` was specified more than once.
177 fn duplicate_field<'de, T: ProductVisitor<'de>>(index: usize, field_name: Option<&str>, prod: &T) -> Self {
178 Self::custom(error_on_field("duplicate ", index, field_name, prod))
179 }
180
181 /// A field with name `field_name` does not exist.
182 fn unknown_field_name<'de, T: FieldNameVisitor<'de>>(field_name: &str, expected: &T) -> Self {
183 let el_ty = match expected.kind() {
184 ProductKind::Normal => "field",
185 ProductKind::ReducerArgs => "reducer argument",
186 };
187 if let Some(one_of) = one_of_names(|| expected.field_names()) {
188 Self::custom(format_args!("unknown {el_ty} `{field_name}`, expected {one_of}"))
189 } else {
190 Self::custom(format_args!("unknown {el_ty} `{field_name}`, there are no {el_ty}s"))
191 }
192 }
193
194 /// The `tag` does not specify a variant of the sum type.
195 fn unknown_variant_tag<'de, T: SumVisitor<'de>>(tag: u8, expected: &T) -> Self {
196 Self::custom(format_args!(
197 "unknown tag {tag:#x} for sum type {}",
198 expected.sum_name().unwrap_or("<unknown>"),
199 ))
200 }
201
202 /// The `name` is not that of a variant of the sum type.
203 fn unknown_variant_name<'de, T: VariantVisitor<'de>>(name: &str, expected: &T) -> Self {
204 if let Some(one_of) = one_of_names(|| expected.variant_names().map(Some)) {
205 Self::custom(format_args!("unknown variant `{name}`, expected {one_of}",))
206 } else {
207 Self::custom(format_args!("unknown variant `{name}`, there are no variants"))
208 }
209 }
210}
211
212/// Turns a closure `impl Fn(&mut Formatter) -> Result` into a `Display`able object.
213pub struct FDisplay<F>(F);
214
215impl<F: Fn(&mut fmt::Formatter) -> fmt::Result> fmt::Display for FDisplay<F> {
216 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
217 (self.0)(f)
218 }
219}
220
221/// Turns a closure `F: Fn(&mut Formatter) -> Result` into a `Display`able object.
222pub fn fmt_fn<F: Fn(&mut fmt::Formatter) -> fmt::Result>(f: F) -> FDisplay<F> {
223 FDisplay(f)
224}
225
226/// Returns an error message for a `problem` with field at `index` and an optional `name`.
227fn error_on_field<'a, 'de>(
228 problem: &'static str,
229 index: usize,
230 name: Option<&'a str>,
231 prod: &impl ProductVisitor<'de>,
232) -> impl fmt::Display + 'a {
233 let field_kind = match prod.product_kind() {
234 ProductKind::Normal => "field",
235 ProductKind::ReducerArgs => "reducer argument",
236 };
237 fmt_fn(move |f| {
238 // e.g. "missing field `foo`"
239 f.write_str(problem)?;
240 f.write_str(field_kind)?;
241 if let Some(name) = name {
242 write!(f, " `{name}`")
243 } else {
244 write!(f, " (index {index})")
245 }
246 })
247}
248
249/// Returns an error message for invalid product type lengths.
250fn fmt_invalid_len<'de>(
251 expected: &impl ProductVisitor<'de>,
252) -> FDisplay<impl '_ + Fn(&mut fmt::Formatter) -> fmt::Result> {
253 fmt_fn(|f| {
254 let ty = match expected.product_kind() {
255 ProductKind::Normal => "product type",
256 ProductKind::ReducerArgs => "reducer args for",
257 };
258 let name = expected.product_name().unwrap_or("<product>");
259 let len = expected.product_len();
260
261 write!(f, "{ty} {name} with {len} elements")
262 })
263}
264
265/// A visitor walking through a [`Deserializer`] for products.
266pub trait ProductVisitor<'de> {
267 /// The resulting product.
268 type Output;
269
270 /// Returns the name of the product, if any.
271 fn product_name(&self) -> Option<&str>;
272
273 /// Returns the length of the product.
274 fn product_len(&self) -> usize;
275
276 /// Returns the kind of the product.
277 fn product_kind(&self) -> ProductKind {
278 ProductKind::Normal
279 }
280
281 /// The input contains an unnamed product.
282 fn visit_seq_product<A: SeqProductAccess<'de>>(self, prod: A) -> Result<Self::Output, A::Error>;
283
284 /// The input contains a named product.
285 fn visit_named_product<A: NamedProductAccess<'de>>(self, prod: A) -> Result<Self::Output, A::Error>;
286}
287
288/// What kind of product is this?
289#[derive(Clone, Copy)]
290pub enum ProductKind {
291 // A normal product.
292 Normal,
293 /// A product in the context of reducer arguments.
294 ReducerArgs,
295}
296
297/// Provides a [`ProductVisitor`] with access to each element of the unnamed product in the input.
298///
299/// This is a trait that a [`Deserializer`] passes to a [`ProductVisitor`] implementation.
300pub trait SeqProductAccess<'de> {
301 /// The error type that can be returned if some error occurs during deserialization.
302 type Error: Error;
303
304 /// Deserializes an `T` from the input.
305 ///
306 /// Returns `Ok(Some(value))` for the next element in the product,
307 /// or `Ok(None)` if there are no more remaining items.
308 ///
309 /// This method exists as a convenience for [`Deserialize`] implementations.
310 /// [`SeqProductAccess`] implementations should not override the default behavior.
311 fn next_element<T: Deserialize<'de>>(&mut self) -> Result<Option<T>, Self::Error> {
312 self.next_element_seed(PhantomData)
313 }
314
315 /// Statefully deserializes `T::Output` from the input provided a `seed` value.
316 ///
317 /// Returns `Ok(Some(value))` for the next element in the unnamed product,
318 /// or `Ok(None)` if there are no more remaining items.
319 ///
320 /// [`Deserialize`] implementations should typically use
321 /// [`next_element`](SeqProductAccess::next_element) instead.
322 fn next_element_seed<T: DeserializeSeed<'de>>(&mut self, seed: T) -> Result<Option<T::Output>, Self::Error>;
323}
324
325/// Provides a [`ProductVisitor`] with access to each element of the named product in the input.
326///
327/// This is a trait that a [`Deserializer`] passes to a [`ProductVisitor`] implementation.
328pub trait NamedProductAccess<'de> {
329 /// The error type that can be returned if some error occurs during deserialization.
330 type Error: Error;
331
332 /// Deserializes field name of type `V::Output` from the input using a visitor
333 /// provided by the deserializer.
334 fn get_field_ident<V: FieldNameVisitor<'de>>(&mut self, visitor: V) -> Result<Option<V::Output>, Self::Error>;
335
336 /// Deserializes field value of type `T` from the input.
337 ///
338 /// This method exists as a convenience for [`Deserialize`] implementations.
339 /// [`NamedProductAccess`] implementations should not override the default behavior.
340 fn get_field_value<T: Deserialize<'de>>(&mut self) -> Result<T, Self::Error> {
341 self.get_field_value_seed(PhantomData)
342 }
343
344 /// Statefully deserializes the field value `T::Output` from the input provided a `seed` value.
345 ///
346 /// [`Deserialize`] implementations should typically use
347 /// [`next_element`](NamedProductAccess::get_field_value) instead.
348 fn get_field_value_seed<T: DeserializeSeed<'de>>(&mut self, seed: T) -> Result<T::Output, Self::Error>;
349}
350
351/// Visitor used to deserialize the name of a field.
352pub trait FieldNameVisitor<'de> {
353 /// The resulting field name.
354 type Output;
355
356 /// The sort of product deserialized.
357 fn kind(&self) -> ProductKind {
358 ProductKind::Normal
359 }
360
361 /// Provides a list of valid field names.
362 ///
363 /// Where `None` is yielded, this indicates a nameless field.
364 fn field_names(&self) -> impl '_ + Iterator<Item = Option<&str>>;
365
366 /// Deserializes the name of a field using `name`.
367 fn visit<E: Error>(self, name: &str) -> Result<Self::Output, E>;
368
369 /// Deserializes the name of a field using `index`.
370 ///
371 /// The `name` is provided for error messages.
372 fn visit_seq<E: Error>(self, index: usize, name: &str) -> Result<Self::Output, E>;
373}
374
375/// A visitor walking through a [`Deserializer`] for sums.
376///
377/// This side is provided by a [`Deserialize`] implementation
378/// when calling [`Deserializer::deserialize_sum`].
379pub trait SumVisitor<'de> {
380 /// The resulting sum.
381 type Output;
382
383 /// Returns the name of the sum, if any.
384 fn sum_name(&self) -> Option<&str>;
385
386 /// Returns whether an option is expected.
387 ///
388 /// The provided implementation does not.
389 fn is_option(&self) -> bool {
390 false
391 }
392
393 /// Drives the deserialization of a sum value.
394 ///
395 /// This method will ask the data format ([`A: SumAccess`][SumAccess])
396 /// which variant of the sum to select in terms of a variant name / tag.
397 /// `A` will use a [`VariantVisitor`], that `SumVisitor` has provided,
398 /// to translate into something that is meaningful for `visit_sum`, e.g., an index.
399 ///
400 /// The data format will also return an object ([`VariantAccess`])
401 /// that can deserialize the contents of the variant.
402 fn visit_sum<A: SumAccess<'de>>(self, data: A) -> Result<Self::Output, A::Error>;
403}
404
405/// Provides a [`SumVisitor`] access to the data of a sum in the input.
406///
407/// An `A: SumAccess` object is created by the [`D: Deserializer`]
408/// which passes `A` to a [`V: SumVisitor`] that `D` in turn was passed.
409/// `A` is then used by `V` to split tag and value input apart.
410pub trait SumAccess<'de> {
411 /// The error type that can be returned if some error occurs during deserialization.
412 type Error: Error;
413
414 /// The visitor used to deserialize the content of the sum variant.
415 type Variant: VariantAccess<'de, Error = Self::Error>;
416
417 /// Called to identify which variant to deserialize.
418 /// Returns a tuple with the result of identification (`V::Output`)
419 /// and the input to variant data deserialization.
420 ///
421 /// The `visitor` is provided by the [`Deserializer`].
422 /// This method is typically called from [`SumVisitor::visit_sum`]
423 /// which will provide the [`V: VariantVisitor`](VariantVisitor).
424 fn variant<V: VariantVisitor<'de>>(self, visitor: V) -> Result<(V::Output, Self::Variant), Self::Error>;
425}
426
427/// A visitor passed from [`SumVisitor`] to [`SumAccess::variant`]
428/// which the latter uses to decide what variant to deserialize.
429pub trait VariantVisitor<'de> {
430 /// The result of identifying a variant, e.g., some index type.
431 type Output;
432
433 /// Provides a list of variant names.
434 fn variant_names(&self) -> impl '_ + Iterator<Item = &str>;
435
436 /// Identify the variant based on `tag`.
437 fn visit_tag<E: Error>(self, tag: u8) -> Result<Self::Output, E>;
438
439 /// Identify the variant based on `name`.
440 fn visit_name<E: Error>(self, name: &str) -> Result<Self::Output, E>;
441}
442
443/// A visitor passed from [`SumAccess`] to [`SumVisitor::visit_sum`]
444/// which the latter uses to deserialize the data of a selected variant.
445pub trait VariantAccess<'de>: Sized {
446 type Error: Error;
447
448 /// Called when deserializing the contents of a sum variant.
449 ///
450 /// This method exists as a convenience for [`Deserialize`] implementations.
451 fn deserialize<T: Deserialize<'de>>(self) -> Result<T, Self::Error> {
452 self.deserialize_seed(PhantomData)
453 }
454
455 /// Called when deserializing the contents of a sum variant, and provided with a `seed` value.
456 fn deserialize_seed<T: DeserializeSeed<'de>>(self, seed: T) -> Result<T::Output, Self::Error>;
457}
458
459/// A `SliceVisitor` is provided a slice `T` of some elements by a [`Deserializer`]
460/// and is tasked with translating this slice to the `Output` type.
461pub trait SliceVisitor<'de, T: ToOwned + ?Sized>: Sized {
462 /// The output produced by this visitor.
463 type Output;
464
465 /// The input contains a slice.
466 ///
467 /// The lifetime of the slice is ephemeral
468 /// and it may be destroyed after this method returns.
469 fn visit<E: Error>(self, slice: &T) -> Result<Self::Output, E>;
470
471 /// The input contains a slice and ownership of the slice is being given to the [`SliceVisitor`].
472 fn visit_owned<E: Error>(self, buf: T::Owned) -> Result<Self::Output, E> {
473 self.visit(buf.borrow())
474 }
475
476 /// The input contains a slice that lives at least as long (`'de`) as the [`Deserializer`].
477 fn visit_borrowed<E: Error>(self, borrowed_slice: &'de T) -> Result<Self::Output, E> {
478 self.visit(borrowed_slice)
479 }
480}
481
482/// A visitor walking through a [`Deserializer`] for arrays.
483pub trait ArrayVisitor<'de, T> {
484 /// The output produced by this visitor.
485 type Output;
486
487 /// The input contains an array.
488 fn visit<A: ArrayAccess<'de, Element = T>>(self, vec: A) -> Result<Self::Output, A::Error>;
489}
490
491/// Provides an [`ArrayVisitor`] with access to each element of the array in the input.
492///
493/// This is a trait that a [`Deserializer`] passes to an [`ArrayVisitor`] implementation.
494pub trait ArrayAccess<'de> {
495 /// The element / base type of the array.
496 type Element;
497
498 /// The error type that can be returned if some error occurs during deserialization.
499 type Error: Error;
500
501 /// This returns `Ok(Some(value))` for the next element in the array,
502 /// or `Ok(None)` if there are no more remaining elements.
503 fn next_element(&mut self) -> Result<Option<Self::Element>, Self::Error>;
504
505 /// Returns the number of elements remaining in the array, if known.
506 fn size_hint(&self) -> Option<usize> {
507 None
508 }
509}
510
511/// `DeserializeSeed` is the stateful form of the [`Deserialize`] trait.
512pub trait DeserializeSeed<'de> {
513 /// The type produced by using this seed.
514 type Output;
515
516 /// Equivalent to the more common [`Deserialize::deserialize`] associated function,
517 /// except with some initial piece of data (the seed `self`) passed in.
518 fn deserialize<D: Deserializer<'de>>(self, deserializer: D) -> Result<Self::Output, D::Error>;
519}
520
521use crate::de::impls::BorrowedSliceVisitor;
522pub use spacetimedb_bindings_macro::Deserialize;
523
524/// A data structure that can be deserialized from any data format supported by the SpacetimeDB Algebraic Type System.
525///
526/// In most cases, implementations of `Deserialize` may be `#[derive(Deserialize)]`d.
527///
528/// The `Deserialize` trait in SATS performs the same function as `serde::Deserialize` in [`serde`].
529/// See the documentation of `serde::Deserialize` for more information of the data model.
530///
531/// The lifetime `'de` allows us to deserialize lifetime-generic types in a zero-copy fashion.
532///
533/// Do not manually implement this trait unless you know what you are doing.
534/// Implementations must be consistent with `Serialize for T`, `SpacetimeType for T` and `Serialize, Deserialize for AlgebraicValue`.
535/// Implementations that are inconsistent across these traits may result in data loss.
536///
537/// [`serde`]: https://crates.io/crates/serde
538pub trait Deserialize<'de>: Sized {
539 /// Deserialize this value from the given `deserializer`.
540 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error>;
541
542 #[doc(hidden)]
543 /// Deserialize this value from the given the BSATN `deserializer`.
544 fn deserialize_from_bsatn<R: BufReader<'de>>(
545 deserializer: bsatn::Deserializer<'de, R>,
546 ) -> Result<Self, bsatn::DecodeError> {
547 Self::deserialize(deserializer)
548 }
549
550 /// used in the Deserialize for Vec<T> impl to allow specializing deserializing Vec<T> as bytes
551 #[doc(hidden)]
552 #[inline(always)]
553 fn __deserialize_vec<D: Deserializer<'de>>(deserializer: D) -> Result<Vec<Self>, D::Error> {
554 deserializer.deserialize_array(BasicVecVisitor)
555 }
556
557 #[doc(hidden)]
558 #[inline(always)]
559 fn __deserialize_array<D: Deserializer<'de>, const N: usize>(deserializer: D) -> Result<[Self; N], D::Error> {
560 deserializer.deserialize_array(BasicArrayVisitor)
561 }
562}
563
564/// A data structure that can be deserialized in SATS
565/// without borrowing any data from the deserializer.
566pub trait DeserializeOwned: for<'de> Deserialize<'de> {}
567impl<T: for<'de> Deserialize<'de>> DeserializeOwned for T {}
568
569impl<'de, T: Deserialize<'de>> DeserializeSeed<'de> for PhantomData<T> {
570 type Output = T;
571
572 fn deserialize<D: Deserializer<'de>>(self, deserializer: D) -> Result<Self::Output, D::Error> {
573 T::deserialize(deserializer)
574 }
575}
576
577/// A vector with two operations: `with_capacity` and `push`.
578pub trait GrowingVec<T> {
579 /// Create the collection with the given capacity.
580 fn with_capacity(cap: usize) -> Self;
581
582 /// Push to the vector the `elem`.
583 fn push(&mut self, elem: T);
584}
585
586impl<T> GrowingVec<T> for Vec<T> {
587 fn with_capacity(cap: usize) -> Self {
588 Self::with_capacity(cap)
589 }
590 fn push(&mut self, elem: T) {
591 self.push(elem)
592 }
593}
594
595impl<T, const N: usize> GrowingVec<T> for SmallVec<[T; N]> {
596 fn with_capacity(cap: usize) -> Self {
597 Self::with_capacity(cap)
598 }
599 fn push(&mut self, elem: T) {
600 self.push(elem)
601 }
602}
603
604/// A basic implementation of `ArrayVisitor::visit` using the provided size hint.
605pub fn array_visit<'de, A: ArrayAccess<'de>, V: GrowingVec<A::Element>>(mut access: A) -> Result<V, A::Error> {
606 let mut v = V::with_capacity(access.size_hint().unwrap_or(0));
607 while let Some(x) = access.next_element()? {
608 v.push(x)
609 }
610 Ok(v)
611}
612
613/// An implementation of [`ArrayVisitor<'de, T>`] where the output is a `Vec<T>`.
614pub struct BasicVecVisitor;
615
616impl<'de, T> ArrayVisitor<'de, T> for BasicVecVisitor {
617 type Output = Vec<T>;
618
619 fn visit<A: ArrayAccess<'de, Element = T>>(self, vec: A) -> Result<Self::Output, A::Error> {
620 array_visit(vec)
621 }
622}
623
624/// An implementation of [`ArrayVisitor<'de, T>`] where the output is a `SmallVec<[T; N]>`.
625pub struct BasicSmallVecVisitor<const N: usize>;
626
627impl<'de, T, const N: usize> ArrayVisitor<'de, T> for BasicSmallVecVisitor<N> {
628 type Output = SmallVec<[T; N]>;
629
630 fn visit<A: ArrayAccess<'de, Element = T>>(self, vec: A) -> Result<Self::Output, A::Error> {
631 array_visit(vec)
632 }
633}
634
635/// An implementation of [`ArrayVisitor<'de, T>`] where the output is a `[T; N]`.
636struct BasicArrayVisitor<const N: usize>;
637
638impl<'de, T, const N: usize> ArrayVisitor<'de, T> for BasicArrayVisitor<N> {
639 type Output = [T; N];
640
641 fn visit<A: ArrayAccess<'de, Element = T>>(self, mut vec: A) -> Result<Self::Output, A::Error> {
642 let mut v = arrayvec::ArrayVec::<T, N>::new();
643 while let Some(el) = vec.next_element()? {
644 v.try_push(el)
645 .map_err(|_| Error::custom("too many elements for array"))?
646 }
647 v.into_inner().map_err(|_| Error::custom("too few elements for array"))
648 }
649}
650
651/// Provided a list of names,
652/// returns a human readable list of all the names,
653/// or `None` in the case of an empty list of names.
654fn one_of_names<'a, I: Iterator<Item = Option<&'a str>>>(names: impl Fn() -> I) -> Option<impl fmt::Display> {
655 // Count how many names there are.
656 let count = names().count();
657
658 // There was at least one name; render those names.
659 (count != 0).then(move || {
660 fmt_fn(move |f| {
661 let mut anon_name = 0;
662 // An example of what happens for names "foo", "bar", and "baz":
663 //
664 // count = 1 -> "`foo`"
665 // = 2 -> "`foo` or `bar`"
666 // > 2 -> "one of `foo`, `bar`, or `baz`"
667 for (index, mut name) in names().enumerate() {
668 let mut name_buf: String = String::new();
669 let name = name.get_or_insert_with(|| {
670 name_buf = format!("{anon_name}");
671 anon_name += 1;
672 &name_buf
673 });
674 match (count, index) {
675 (1, _) => write!(f, "`{name}`"),
676 (2, 1) => write!(f, "`{name}`"),
677 (2, 2) => write!(f, "`or `{name}`"),
678 (_, 1) => write!(f, "one of `{name}`"),
679 (c, i) if i < c => write!(f, ", `{name}`"),
680 (_, _) => write!(f, ", `, or {name}`"),
681 }?;
682 }
683
684 Ok(())
685 })
686 })
687}
688
689/// Deserializes `none` variant of an optional value.
690pub struct NoneAccess<E>(PhantomData<E>);
691
692impl<E: Error> NoneAccess<E> {
693 /// Returns a new [`NoneAccess`].
694 pub fn new() -> Self {
695 Self(PhantomData)
696 }
697}
698
699impl<E: Error> Default for NoneAccess<E> {
700 fn default() -> Self {
701 Self::new()
702 }
703}
704
705impl<'de, E: Error> SumAccess<'de> for NoneAccess<E> {
706 type Error = E;
707 type Variant = Self;
708
709 fn variant<V: VariantVisitor<'de>>(self, visitor: V) -> Result<(V::Output, Self::Variant), Self::Error> {
710 visitor.visit_name("none").map(|var| (var, self))
711 }
712}
713impl<'de, E: Error> VariantAccess<'de> for NoneAccess<E> {
714 type Error = E;
715 fn deserialize_seed<T: DeserializeSeed<'de>>(self, seed: T) -> Result<T::Output, Self::Error> {
716 use crate::algebraic_value::de::*;
717 seed.deserialize(ValueDeserializer::new(crate::AlgebraicValue::unit()))
718 .map_err(|err| match err {
719 ValueDeserializeError::MismatchedType => E::custom("mismatched type"),
720 ValueDeserializeError::Custom(err) => E::custom(err),
721 })
722 }
723}