use core::{convert::Infallible, fmt::Display};
mod r#impl;
mod visit;
pub use visit::*;
pub trait Error: core::error::Error + Sized {
fn custom<T>(msg: T) -> Self
where
T: Display;
fn invalid_type(unexp: impl Display, exp: impl Display) -> Self {
Self::custom(format_args!("invalid type: {unexp}, expected {exp}"))
}
fn missing_field(field: impl Display) -> Self {
Self::custom(format_args!("missing field for deserializer: {field}"))
}
}
pub trait Deserialize<'de>: Sized {
const IS_CONDITIONAL: bool = true;
fn deserialize<D>(deserializer: D) -> Result<Option<Self>, D::Error>
where
D: Deserializer<'de>;
}
pub trait Deserializer<'de> {
type Error: Error;
const FLAT_CLASSES: bool;
fn src_namespace(&self) -> &str;
fn dst_namespaces(&self) -> impl Iterator<Item = &str>;
fn deserialize_any<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>;
#[inline]
fn deserialize_class<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_any(visitor)
}
#[inline]
fn deserialize_field<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_any(visitor)
}
#[inline]
fn deserialize_method<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_any(visitor)
}
#[inline]
fn deserialize_method_arg<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_any(visitor)
}
#[inline]
fn deserialize_method_var<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_any(visitor)
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(0, None)
}
}
impl<'de, T> Deserializer<'de> for &mut T
where
T: Deserializer<'de>,
{
type Error = T::Error;
const FLAT_CLASSES: bool = T::FLAT_CLASSES;
#[inline]
fn deserialize_any<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
T::deserialize_any(self, visitor)
}
#[inline]
fn deserialize_class<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
T::deserialize_class(self, visitor)
}
#[inline]
fn deserialize_field<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
T::deserialize_field(self, visitor)
}
#[inline]
fn deserialize_method<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
T::deserialize_method(self, visitor)
}
#[inline]
fn deserialize_method_arg<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
T::deserialize_method_arg(self, visitor)
}
#[inline]
fn deserialize_method_var<V>(&mut self, visitor: V) -> Result<Option<V::Value>, Self::Error>
where
V: Visitor<'de>,
{
T::deserialize_method_var(self, visitor)
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
T::size_hint(self)
}
#[inline]
fn src_namespace(&self) -> &str {
T::src_namespace(self)
}
#[inline]
fn dst_namespaces(&self) -> impl Iterator<Item = &str> {
T::dst_namespaces(self)
}
}
impl Error for Infallible {
fn custom<T>(_msg: T) -> Self
where
T: Display,
{
unreachable!()
}
}