serde_aws_query_ce/de/
query_str_deserializer.rs1use 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}