use serde::de::value::{Error as ValError, SeqDeserializer};
use serde::de::{Deserializer, Error as DeError, IntoDeserializer, Visitor};
use serde::forward_to_deserialize_any;
use super::{CowValue, ValueEnumAccess};
macro_rules! forward_vec_parsed_value {
($($ty:ident => $method:ident,)*) => {
$(
fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: Visitor<'de>
{
if let Some(item) = self.0.into_iter().next() {
match item.0.parse::<$ty>() {
Ok(val) => val.into_deserializer().$method(visitor),
Err(e) => Err(DeError::custom(e))
}
} else {
Err(DeError::custom("expected vec not empty"))
}
}
)*
}
}
pub(super) struct VecValue<I>(pub(super) I);
impl<'de, I> IntoDeserializer<'de> for VecValue<I>
where
I: Iterator<Item = CowValue<'de>>,
{
type Deserializer = Self;
#[inline]
fn into_deserializer(self) -> Self::Deserializer {
self
}
}
impl<'de, I> Deserializer<'de> for VecValue<I>
where
I: IntoIterator<Item = CowValue<'de>>,
{
type Error = ValError;
#[inline]
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
let mut iter = self.0.into_iter();
let Some(first) = iter.next() else {
return Err(DeError::custom("expected vec not empty"));
};
if let Some(second) = iter.next() {
let mut items = Vec::with_capacity(2);
items.push(first);
items.push(second);
items.extend(iter);
return visitor.visit_seq(SeqDeserializer::new(items.into_iter()));
}
first.deserialize_any(visitor)
}
#[inline]
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
let mut iter = self.0.into_iter();
let Some(first) = iter.next() else {
return visitor.visit_none();
};
let mut items = Vec::with_capacity(2);
items.push(first);
items.extend(iter);
visitor.visit_some(VecValue(items.into_iter()))
}
#[inline]
fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
if let Some(item) = self.0.into_iter().next() {
item.deserialize_str(visitor)
} else {
Err(DeError::custom("expected vec not empty"))
}
}
#[inline]
fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
if let Some(item) = self.0.into_iter().next() {
item.deserialize_string(visitor)
} else {
Err(DeError::custom("expected vec not empty"))
}
}
#[inline]
fn deserialize_enum<V>(
self,
_name: &'static str,
_variants: &'static [&'static str],
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
if let Some(item) = self.0.into_iter().next() {
visitor.visit_enum(ValueEnumAccess(item.0))
} else {
Err(DeError::custom("expected vec not empty"))
}
}
#[inline]
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)
}
#[inline]
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)
}
#[inline]
fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
self.deserialize_seq(visitor)
}
#[inline]
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_seq(SeqDeserializer::new(self.0.into_iter()))
}
forward_to_deserialize_any! {
char
unit
bytes
byte_buf
unit_struct
struct
identifier
ignored_any
map
}
forward_vec_parsed_value! {
bool => deserialize_bool,
u8 => deserialize_u8,
u16 => deserialize_u16,
u32 => deserialize_u32,
u64 => deserialize_u64,
i8 => deserialize_i8,
i16 => deserialize_i16,
i32 => deserialize_i32,
i64 => deserialize_i64,
f32 => deserialize_f32,
f64 => deserialize_f64,
}
}