use crate::serde::de::{Deserialize, Deserializer, MapAccess, SeqAccess, Visitor};
use std::collections::HashMap;
use std::error::Error;
use std::fmt;
use std::marker::PhantomData;
pub struct IntegerVisitor;
impl<'de> Visitor<'de> for IntegerVisitor {
type Value = i64;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("integer")
}
fn visit_i8<E>(self, num: i8) -> Result<Self::Value, E>
where
E: Error,
{
Ok(num.into())
}
fn visit_i32<E>(self, num: i32) -> Result<Self::Value, E>
where
E: Error,
{
Ok(num.into())
}
fn visit_i64<E>(self, num: i64) -> Result<Self::Value, E>
where
E: Error,
{
Ok(num)
}
fn visit_u8<E>(self, num: u8) -> Result<Self::Value, E>
where
E: Error,
{
Ok(num.into())
}
fn visit_u32<E>(self, num: u32) -> Result<Self::Value, E>
where
E: Error,
{
Ok(num.into())
}
fn visit_u64<E>(self, num: u64) -> Result<Self::Value, E>
where
E: Error,
{
Ok(num as i64)
}
}
pub fn deserialize_vec<'de, T, D>(deserializer: D) -> Result<Vec<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
struct VecVisitor<T>(PhantomData<T>);
impl<'de, T> Visitor<'de> for VecVisitor<T>
where
T: Deserialize<'de>,
{
type Value = Vec<T>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("sequence or unit")
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut vec = Vec::new();
while let Some(item) = seq.next_element()? {
vec.push(item);
}
Ok(vec)
}
fn visit_none<E>(self) -> Result<Self::Value, E>
where
E: Error,
{
Ok(Default::default())
}
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(VecVisitor(PhantomData))
}
}
deserializer.deserialize_option(VecVisitor(PhantomData))
}
pub fn deserialize_hashmap<'de, T, D>(deserializer: D) -> Result<HashMap<String, T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
struct MapVisitor<T>(PhantomData<T>);
impl<'de, T> Visitor<'de> for MapVisitor<T>
where
T: Deserialize<'de>,
{
type Value = HashMap<String, T>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("map or unit")
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
let mut hashmap = HashMap::new();
while let Some((key, value)) = map.next_entry()? {
hashmap.insert(key, value);
}
Ok(hashmap)
}
fn visit_none<E>(self) -> Result<Self::Value, E>
where
E: Error,
{
Ok(Default::default())
}
fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_map(MapVisitor(PhantomData))
}
}
deserializer.deserialize_option(MapVisitor(PhantomData))
}