use alloc::borrow::Cow;
use alloc::vec::Vec;
use crate::error::Error;
use crate::event::Atom;
pub(crate) mod atoms;
mod collect;
mod deserializer;
mod driver;
pub(crate) mod duplicates;
#[cfg(feature = "derive")]
pub(crate) mod enums;
#[cfg(feature = "derive")]
pub(crate) mod fields;
mod ignore;
pub(crate) mod impls;
mod layer;
pub(crate) mod lexical;
mod limits;
pub(crate) mod mapped;
mod owned;
pub(crate) mod recording;
mod sinkbox;
pub(crate) mod slot;
mod stream;
pub(crate) mod unknown;
pub(crate) mod update;
pub use self::atoms::default_atom;
pub(crate) use self::atoms::{atom_into_handle, borrowed_atom_into_handle};
use self::atoms::{
default_borrowed_key_atom, default_borrowed_value_atom, default_container, default_key_atom,
default_value_atom,
};
pub use self::collect::{CollectErrors, CollectedErrors};
pub use self::deserializer::{Deserializer, deserialize_value};
pub use self::driver::DeserializeDriver;
pub use self::duplicates::DuplicateKeys;
#[doc(hidden)]
pub use self::impls::DeserializeArc;
pub use self::layer::{Layer, LayerEvent, Next};
pub use self::lexical::{ContentKey, LexicalRules};
pub use self::limits::{Limits, LimitsBuilder};
pub use self::owned::{OwnedDriver, OwnedSink};
pub use self::recording::{RecordBuf, Recording};
#[cfg(feature = "derive")]
use self::sinkbox::ArenaStruct;
use self::sinkbox::{ArenaSink, HeapSink, arena_sink};
pub use self::slot::Slot;
pub use self::stream::{Frame, Progress, StreamDeserializer};
pub use self::unknown::{IgnoredFields, UnknownFields};
pub use self::update::checked_update;
use crate::State;
#[doc(hidden)]
pub struct InlineSeq<T> {
pub start: fn(&mut Option<T>),
pub atom: fn(&mut Option<T>, usize, Atom, &mut State) -> Result<(), Error>,
pub end: fn(&mut Option<T>, usize) -> Result<(), Error>,
pub container: fn(usize, bool, &mut State) -> Error,
}
#[doc(hidden)]
#[derive(Clone, Copy)]
pub enum InlineEvent {
Start,
End(usize),
Container(usize, bool),
}
#[cold]
#[inline(never)]
fn no_inline_seq() -> ! {
panic!("the sink does not build sequences inline")
}
pub struct SinkHandle<'a, 'de: 'a>(HandleInner<'a, 'de>);
enum HandleInner<'a, 'de> {
Borrowed(&'a mut dyn Sink<'de>),
Arena(ArenaSink<'a, 'de>),
Heap(HeapSink<'a, 'de>),
#[cfg(feature = "derive")]
Struct(ArenaStruct<'a, 'de>),
Null(ignore::Ignore),
OptionalBorrowed(&'a mut dyn Sink<'de>),
OptionalArena(ArenaSink<'a, 'de>),
OptionalHeap(HeapSink<'a, 'de>),
#[cfg(feature = "derive")]
OptionalStruct(ArenaStruct<'a, 'de>),
}
impl<'a, 'de> SinkHandle<'a, 'de> {
pub fn to(sink: &'a mut dyn Sink<'de>) -> SinkHandle<'a, 'de> {
SinkHandle(HandleInner::Borrowed(sink))
}
#[inline(always)]
pub fn arena<S: Sink<'de> + 'a>(sink: S, state: &mut State) -> SinkHandle<'a, 'de> {
SinkHandle(HandleInner::Arena(arena_sink(sink, &mut state.arena)))
}
#[inline(always)]
pub(crate) unsafe fn arena_unbounded<S: Sink<'de>>(
sink: S,
state: &mut State,
) -> SinkHandle<'a, 'de> {
SinkHandle(HandleInner::Arena(unsafe {
sinkbox::arena_sink_unbounded(sink, &mut state.arena)
}))
}
#[inline(always)]
pub(crate) fn release(self, state: &mut State) {
match self.0 {
HandleInner::Arena(sink) | HandleInner::OptionalArena(sink) => {
crate::arena::ArenaBox::release_in(sink, &mut state.arena)
}
#[cfg(feature = "derive")]
HandleInner::Struct(sink) | HandleInner::OptionalStruct(sink) => {
sink.release_in(&mut state.arena)
}
_ => {}
}
}
pub fn heap<S: Sink<'de> + 'a>(sink: S) -> SinkHandle<'a, 'de> {
SinkHandle(HandleInner::Heap(HeapSink::new(sink)))
}
#[cfg(feature = "derive")]
#[inline]
pub(crate) fn from_arena_struct(sink: ArenaStruct<'a, 'de>) -> SinkHandle<'a, 'de> {
SinkHandle(HandleInner::Struct(sink))
}
pub fn null() -> SinkHandle<'a, 'de> {
SinkHandle(HandleInner::Null(ignore::Ignore))
}
pub fn shorten<'b>(self) -> SinkHandle<'b, 'de>
where
'a: 'b,
{
SinkHandle(match self.0 {
HandleInner::Borrowed(sink) => HandleInner::Borrowed(sink),
HandleInner::Arena(sink) => HandleInner::Arena(sink),
HandleInner::Heap(sink) => HandleInner::Heap(sink),
HandleInner::Null(sink) => HandleInner::Null(sink),
HandleInner::OptionalBorrowed(sink) => HandleInner::OptionalBorrowed(sink),
HandleInner::OptionalArena(sink) => HandleInner::OptionalArena(sink),
HandleInner::OptionalHeap(sink) => HandleInner::OptionalHeap(sink),
#[cfg(feature = "derive")]
HandleInner::Struct(sink) => HandleInner::Struct(sink),
#[cfg(feature = "derive")]
HandleInner::OptionalStruct(sink) => HandleInner::OptionalStruct(sink),
})
}
pub fn is_null(&self) -> bool {
matches!(self.0, HandleInner::Null(_))
}
pub fn ignore_null(self) -> SinkHandle<'a, 'de> {
SinkHandle(match self.0 {
HandleInner::Borrowed(sink) => HandleInner::OptionalBorrowed(sink),
HandleInner::Arena(sink) => HandleInner::OptionalArena(sink),
HandleInner::Heap(sink) => HandleInner::OptionalHeap(sink),
#[cfg(feature = "derive")]
HandleInner::Struct(sink) => HandleInner::OptionalStruct(sink),
other => other,
})
}
#[inline(always)]
fn skip_null(&mut self, atom: &Atom) -> bool {
if self.is_optional() && is_null_atom(atom) {
*self = SinkHandle::null();
return true;
}
false
}
#[inline(always)]
fn sink(&self) -> &(dyn Sink<'de> + 'a) {
match self.0 {
HandleInner::Borrowed(ref sink) | HandleInner::OptionalBorrowed(ref sink) => &**sink,
HandleInner::Arena(ref sink) | HandleInner::OptionalArena(ref sink) => sink.get(),
HandleInner::Heap(ref sink) | HandleInner::OptionalHeap(ref sink) => sink.get(),
#[cfg(feature = "derive")]
HandleInner::Struct(ref sink) | HandleInner::OptionalStruct(ref sink) => sink.get(),
HandleInner::Null(ref sink) => sink,
}
}
#[inline(always)]
fn sink_mut(&mut self) -> &mut (dyn Sink<'de> + 'a) {
match self.0 {
HandleInner::Borrowed(ref mut sink) | HandleInner::OptionalBorrowed(ref mut sink) => {
&mut **sink
}
HandleInner::Arena(ref mut sink) | HandleInner::OptionalArena(ref mut sink) => {
sink.get_mut()
}
HandleInner::Heap(ref mut sink) | HandleInner::OptionalHeap(ref mut sink) => {
sink.get_mut()
}
#[cfg(feature = "derive")]
HandleInner::Struct(ref mut sink) | HandleInner::OptionalStruct(ref mut sink) => {
sink.get_mut()
}
HandleInner::Null(ref mut sink) => sink,
}
}
}
#[cold]
fn is_null_ext(ext: &crate::ext::ExtValue) -> bool {
matches!(ext.fallback(), Atom::Null)
}
#[inline]
pub(crate) fn is_null_atom(atom: &Atom) -> bool {
match atom {
Atom::Null => true,
Atom::Ext(ext) => is_null_ext(ext),
Atom::Implicit(value) => value.value() == crate::ImplicitValue::Null,
_ => false,
}
}
#[inline]
pub(crate) fn is_empty_lexical(atom: &Atom, state: &State) -> bool {
matches!(atom, Atom::Lexical(value) if lexical::is_empty_null(value, state))
}
#[inline]
pub(crate) fn empty_lexical_or_none<'a>(
atom: Atom<'a>,
state: &mut State,
mut deliver: impl FnMut(Atom<'a>, &mut State) -> Result<(), Error>,
) -> Result<bool, Error> {
let retry = atom.clone();
match state.discard_errors(|state| deliver(atom, state)) {
Ok(()) => Ok(true),
Err(err) if err.kind().is_rejection() => Ok(false),
Err(err) if state.discards_errors => Err(err),
Err(_) => deliver(retry, state).map(|()| true),
}
}
impl<'a, 'de> SinkHandle<'a, 'de> {
#[inline(always)]
fn is_optional(&self) -> bool {
match self.0 {
HandleInner::OptionalBorrowed(_)
| HandleInner::OptionalArena(_)
| HandleInner::OptionalHeap(_) => true,
#[cfg(feature = "derive")]
HandleInner::OptionalStruct(_) => true,
_ => false,
}
}
#[cold]
#[inline(never)]
fn empty_lexical_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
if !empty_lexical_or_none(atom, state, |atom, state| self.sink_mut().atom(atom, state))? {
*self = SinkHandle::null();
}
Ok(())
}
#[cold]
#[inline(never)]
fn empty_lexical_borrowed_atom(
&mut self,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
let delivered = empty_lexical_or_none(atom, state, |atom, state| {
self.sink_mut().borrowed_atom(atom, state)
})?;
if !delivered {
*self = SinkHandle::null();
}
Ok(())
}
}
impl<'a, 'de> Sink<'de> for SinkHandle<'a, 'de> {
#[inline]
fn atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
if self.skip_null(&atom) {
return Ok(());
}
if self.is_optional() && is_empty_lexical(&atom, state) {
return self.empty_lexical_atom(atom, state);
}
self.sink_mut().atom(atom, state)
}
#[inline]
fn borrowed_atom(&mut self, atom: Atom<'de>, state: &mut State) -> Result<(), Error> {
if self.skip_null(&atom) {
return Ok(());
}
if self.is_optional() && is_empty_lexical(&atom, state) {
return self.empty_lexical_borrowed_atom(atom, state);
}
self.sink_mut().borrowed_atom(atom, state)
}
#[inline]
fn map(&mut self, state: &mut State) -> Result<(), Error> {
self.sink_mut().map(state)
}
#[inline]
fn seq(&mut self, state: &mut State) -> Result<(), Error> {
self.sink_mut().seq(state)
}
#[inline]
fn next_key(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
self.sink_mut().next_key(state)
}
#[inline]
fn next_value(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
self.sink_mut().next_value(state)
}
#[inline]
fn __private_key_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
self.sink_mut().__private_key_atom(atom, state)
}
#[inline]
fn __private_value_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
self.sink_mut().__private_value_atom(atom, state)
}
#[inline]
fn __private_borrowed_key_atom(
&mut self,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
self.sink_mut().__private_borrowed_key_atom(atom, state)
}
#[inline]
fn __private_borrowed_value_atom(
&mut self,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
self.sink_mut().__private_borrowed_value_atom(atom, state)
}
#[inline]
fn __private_seq(&mut self, state: &mut State) -> Result<bool, Error> {
self.sink_mut().__private_seq(state)
}
#[inline]
fn __private_inline_atom(
&mut self,
index: usize,
atom: Atom,
state: &mut State,
) -> Result<(), Error> {
self.sink_mut().__private_inline_atom(index, atom, state)
}
#[inline]
fn __private_inline_event(
&mut self,
event: InlineEvent,
state: &mut State,
) -> Result<(), Error> {
self.sink_mut().__private_inline_event(event, state)
}
fn value_for_key(
&mut self,
key: &str,
state: &mut State,
) -> Result<Option<SinkHandle<'_, 'de>>, Error> {
self.sink_mut().value_for_key(key, state)
}
#[inline]
fn finish(&mut self, state: &mut State) -> Result<(), Error> {
self.sink_mut().finish(state)
}
fn recover(&mut self, err: Error, state: &mut State) -> Result<(), Error> {
self.sink_mut().recover(err, state)
}
fn expecting(&self) -> Cow<'_, str> {
self.sink().expecting()
}
}
pub trait Deserialize<'de, T: Send = Self>: Sized + Send {
#[inline]
fn deserialize_into<'out>(
out: &'out mut Option<T>,
state: &mut State,
) -> SinkHandle<'out, 'de> {
let _ = state;
Slot::<T, Self>::handle(out)
}
fn deserialize_atom(
slot: &mut Slot<T, Self>,
atom: Atom,
state: &mut State,
) -> Result<(), Error> {
default_atom(slot, atom, state)
}
fn deserialize_borrowed_atom(
slot: &mut Slot<T, Self>,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
<Self as Deserialize<'de, T>>::deserialize_atom(slot, atom, state)
}
fn expecting() -> Cow<'static, str> {
slot::short_type_name(core::any::type_name::<Self>())
}
fn describe_type(d: &mut dyn crate::ser::Describe) {
let _ = d;
}
fn initial_value() -> Option<T> {
None
}
fn deserialize_update<'out>(value: &'out mut T, state: &mut State) -> SinkHandle<'out, 'de> {
update::replace_handle_with(
value,
<Self as Deserialize<'de, T>>::deserialize_into,
state,
)
}
#[doc(hidden)]
fn __private_atom_into(
out: &mut Option<T>,
atom: Atom,
state: &mut State,
) -> Result<(), Error> {
atom_into_handle(
<Self as Deserialize<'de, T>>::deserialize_into(out, state),
atom,
state,
)
}
#[doc(hidden)]
fn __private_borrowed_atom_into(
out: &mut Option<T>,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
borrowed_atom_into_handle(
<Self as Deserialize<'de, T>>::deserialize_into(out, state),
atom,
state,
)
}
#[doc(hidden)]
fn __private_is_bytes() -> bool {
false
}
#[doc(hidden)]
fn __private_vec_from_bytes(bytes: Vec<u8>) -> Option<Vec<T>> {
let _ = bytes;
None
}
#[doc(hidden)]
fn __private_array_from_bytes<const N: usize>(bytes: &[u8]) -> Option<[T; N]> {
let _ = bytes;
None
}
#[doc(hidden)]
fn __private_atom_default() -> Option<T> {
None
}
#[doc(hidden)]
fn __private_inline_seq() -> Option<InlineSeq<T>> {
None
}
#[doc(hidden)]
#[inline(always)]
fn __private_raw() -> Option<&'static crate::ext::RawFormatInfo> {
None
}
#[doc(hidden)]
fn __private_collects() -> bool {
false
}
#[doc(hidden)]
#[inline(always)]
fn __private_rejects_empty_lexical() -> bool {
false
}
#[doc(hidden)]
fn __private_collect_into<'out>(
out: &'out mut Option<T>,
state: &mut State,
) -> SinkHandle<'out, 'de> {
<Self as Deserialize<'de, T>>::deserialize_into(out, state)
}
#[doc(hidden)]
fn __private_collect_update<'out>(
value: &'out mut T,
first: bool,
state: &mut State,
) -> SinkHandle<'out, 'de> {
let _ = first;
<Self as Deserialize<'de, T>>::deserialize_update(value, state)
}
#[doc(hidden)]
fn __private_collect_empty() -> Option<T> {
None
}
}
pub trait DeserializeOwned: for<'de> Deserialize<'de> {}
impl<T> DeserializeOwned for T where T: for<'de> Deserialize<'de> {}
pub fn missing_multimap_value<'de, T: Deserialize<'de>>() -> Option<T> {
T::__private_collect_empty().or_else(T::initial_value)
}
#[doc(hidden)]
pub trait AsDynSink<'de> {
fn __private_as_dyn(&mut self) -> &mut dyn Sink<'de>;
}
impl<'de, T: Sink<'de>> AsDynSink<'de> for T {
#[inline(always)]
fn __private_as_dyn(&mut self) -> &mut dyn Sink<'de> {
self
}
}
pub trait Sink<'de>: Send + AsDynSink<'de> {
fn atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
default_atom(self.__private_as_dyn(), atom, state)
}
fn borrowed_atom(&mut self, atom: Atom<'de>, state: &mut State) -> Result<(), Error> {
self.atom(atom, state)
}
fn map(&mut self, state: &mut State) -> Result<(), Error> {
default_container(self.__private_as_dyn(), "map", state)
}
fn seq(&mut self, state: &mut State) -> Result<(), Error> {
default_container(self.__private_as_dyn(), "sequence", state)
}
fn next_key(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
let _ = state;
Ok(SinkHandle::null())
}
fn next_value(&mut self, state: &mut State) -> Result<SinkHandle<'_, 'de>, Error> {
let _ = state;
Ok(SinkHandle::null())
}
#[doc(hidden)]
fn __private_key_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
default_key_atom(self.__private_as_dyn(), atom, state)
}
#[doc(hidden)]
fn __private_value_atom(&mut self, atom: Atom, state: &mut State) -> Result<(), Error> {
default_value_atom(self.__private_as_dyn(), atom, state)
}
#[doc(hidden)]
fn __private_borrowed_key_atom(
&mut self,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
default_borrowed_key_atom(self.__private_as_dyn(), atom, state)
}
#[doc(hidden)]
fn __private_borrowed_value_atom(
&mut self,
atom: Atom<'de>,
state: &mut State,
) -> Result<(), Error> {
default_borrowed_value_atom(self.__private_as_dyn(), atom, state)
}
#[doc(hidden)]
fn __private_seq(&mut self, state: &mut State) -> Result<bool, Error> {
self.seq(state)?;
Ok(false)
}
#[doc(hidden)]
fn __private_inline_atom(
&mut self,
index: usize,
atom: Atom,
state: &mut State,
) -> Result<(), Error> {
let _ = (index, atom, state);
no_inline_seq()
}
#[doc(hidden)]
fn __private_inline_event(
&mut self,
event: InlineEvent,
state: &mut State,
) -> Result<(), Error> {
let _ = (event, state);
no_inline_seq()
}
fn value_for_key(
&mut self,
key: &str,
state: &mut State,
) -> Result<Option<SinkHandle<'_, 'de>>, Error> {
let _ = key;
let _ = state;
Ok(None)
}
fn finish(&mut self, state: &mut State) -> Result<(), Error> {
let _ = state;
Ok(())
}
fn recover(&mut self, err: Error, state: &mut State) -> Result<(), Error> {
let _ = state;
Err(err)
}
fn expecting(&self) -> Cow<'_, str> {
Cow::Borrowed("compatible type")
}
}