serde_aws_query_ce/de/
query_str_deserializer.rs

1use std::borrow::Cow;
2
3use serde::de::{IntoDeserializer, Visitor};
4use serde::forward_to_deserialize_any;
5
6use crate::de::error::DeError;
7use crate::de::node::Node;
8use crate::de::node_deserializer::NodeDeserializer;
9
10pub(crate) struct QueryStrDeserializer<'de>(Cow<'de, str>);
11
12impl<'de> QueryStrDeserializer<'de> {
13    pub fn new(s: Cow<'de, str>) -> Self {
14        QueryStrDeserializer(s)
15    }
16}
17
18macro_rules! forward_parsable_to_deserialize_any {
19    ($($ty:ident => $meth:ident,)*) => {
20        $(
21            fn $meth<V>(self, visitor: V) -> Result<V::Value, DeError> where V: serde::de::Visitor<'de> {
22                match self.0.parse::<$ty>() {
23                    Ok(val) => val.into_deserializer().$meth(visitor),
24                    Err(e) => Err(DeError::Custom(e.to_string()))
25                }
26            }
27        )*
28    }
29}
30
31impl<'de> serde::Deserializer<'de> for QueryStrDeserializer<'de> {
32    type Error = DeError;
33
34    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
35    where
36        V: Visitor<'de>,
37    {
38        self.0.into_deserializer().deserialize_any(visitor)
39    }
40
41    fn deserialize_enum<V>(
42        self, _: &'static str, _: &'static [&'static str], visitor: V,
43    ) -> Result<V::Value, Self::Error>
44    where
45        V: Visitor<'de>,
46    {
47        visitor.visit_enum(NodeDeserializer::new(Node::Flat(self.0)))
48    }
49
50    forward_to_deserialize_any! {
51        byte_buf
52        bytes
53        char
54        identifier
55        ignored_any
56        newtype_struct
57        map
58        option
59        seq
60        str
61        string
62        struct
63        tuple
64        tuple_struct
65        unit
66        unit_struct
67    }
68
69    forward_parsable_to_deserialize_any! {
70        bool => deserialize_bool,
71        u8 => deserialize_u8,
72        u16 => deserialize_u16,
73        u32 => deserialize_u32,
74        u64 => deserialize_u64,
75        i8 => deserialize_i8,
76        i16 => deserialize_i16,
77        i32 => deserialize_i32,
78        i64 => deserialize_i64,
79        f32 => deserialize_f32,
80        f64 => deserialize_f64,
81    }
82}