use std::marker::PhantomData;
use serde::de::{DeserializeSeed, IntoDeserializer, MapAccess, SeqAccess, Visitor};
use serde::Deserializer;
use serde::de::value::Error;
use crate::common::BorrowedValue;
use crate::Field;
pub(crate) struct RecordDeserializer<'b, R>
where
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
{
inner: <R as IntoIterator>::IntoIter,
value: Option<BorrowedValue<'b>>,
_marker: PhantomData<&'b u8>,
}
impl<'b, R> From<R> for RecordDeserializer<'b, R>
where
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
{
fn from(input: R) -> Self {
Self {
inner: input.into_iter(),
value: None,
_marker: PhantomData,
}
}
}
impl<'b, R> RecordDeserializer<'b, R>
where
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
{
fn next_value(&mut self) -> Option<BorrowedValue<'b>> {
self.inner.next().map(|(_, v)| v)
}
}
impl<'de, 'b: 'de, R> MapAccess<'de> for RecordDeserializer<'b, R>
where
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
{
type Error = Error;
fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
where
K: DeserializeSeed<'de>,
{
match self.inner.next() {
Some((field, value)) => {
self.value = Some(value);
let field = &*field;
seed.deserialize(field.name().into_deserializer()).map(Some)
}
_ => Ok(None),
}
}
fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
where
V: DeserializeSeed<'de>,
{
let value = self.value.take().unwrap(); seed.deserialize(value)
.map_err(<Self::Error as serde::de::Error>::custom)
}
}
impl<'de, 'b: 'de, R> SeqAccess<'de> for RecordDeserializer<'b, R>
where
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
{
type Error = Error;
fn next_element_seed<S>(&mut self, seed: S) -> Result<Option<S::Value>, Self::Error>
where
S: DeserializeSeed<'de>,
{
match self.inner.next() {
Some((_, v)) => seed
.deserialize(v)
.map_err(<Self::Error as serde::de::Error>::custom)
.map(Some),
None => Ok(None),
}
}
}
impl<'de, 'b: 'de, R> Deserializer<'de> for RecordDeserializer<'b, R>
where
R: IntoIterator<Item = (&'b Field, BorrowedValue<'b>)>,
{
type Error = Error;
fn deserialize_any<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
match self.next_value() {
Some(v) => v
.deserialize_any(visitor)
.map_err(<Self::Error as serde::de::Error>::custom),
None => Err(<Self::Error as serde::de::Error>::custom(
"expect value, not none",
)),
}
}
serde::forward_to_deserialize_any! {
bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char bytes byte_buf enum
identifier ignored_any
}
fn deserialize_str<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
match self.next_value() {
Some(v) => v
.deserialize_str(visitor)
.map_err(<Self::Error as serde::de::Error>::custom),
None => Err(<Self::Error as serde::de::Error>::custom(
"expect value, not none",
)),
}
}
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_str(visitor)
}
fn deserialize_option<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
match self.next_value() {
Some(v) => {
if v.is_null() {
visitor.visit_none()
} else {
visitor
.visit_some(v)
.map_err(<Self::Error as serde::de::Error>::custom)
}
}
_ => Err(<Self::Error as serde::de::Error>::custom(
"expect next value",
)),
}
}
fn deserialize_unit<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
match self.next_value() {
Some(_v) => visitor.visit_unit(),
_ => Err(<Self::Error as serde::de::Error>::custom(
"there's no enough value",
)),
}
}
fn deserialize_unit_struct<V>(
self,
_name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_unit(visitor)
}
fn deserialize_newtype_struct<V>(
self,
_name: &'static str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_newtype_struct(self)
}
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_seq(self)
}
fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_seq(self)
}
fn deserialize_tuple_struct<V>(
self,
_name: &'static str,
_len: usize,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_seq(visitor)
}
fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_map(self)
}
fn deserialize_struct<V>(
self,
_name: &'static str,
_fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_map(visitor)
}
}