twilio_data/
ser.rs

1use super::{Call, CallInstruction, Sms, Mms, TwilioRequest};
2
3use core::fmt;
4use std::borrow::Cow;
5
6use serde::ser::{Serialize, Serializer, SerializeMap, SerializeStruct};
7use serde::de::{Deserializer, Deserialize, Visitor, MapAccess, SeqAccess};
8
9impl Serialize for TwilioRequest {
10    #[inline]
11    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12        let buffer = self.buffer.as_slice();
13        let mut ser = serializer.serialize_map(Some(self.len))?;
14
15        for (key, value) in form_urlencoded::parse(buffer) {
16            ser.serialize_entry(key.as_ref(), value.as_ref())?;
17        }
18
19        ser.end()
20    }
21}
22
23struct TwilioRequestVisitor;
24
25impl<'de> Visitor<'de> for TwilioRequestVisitor {
26    type Value = TwilioRequest;
27
28    #[inline(always)]
29    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
30        formatter.write_str("TwilioRequest as sequence of key and value pairs or map")
31    }
32
33    fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
34        let mut result = TwilioRequest::new();
35
36        //Cow - because deserialization might need decode special symbols
37        while let Some(element) = map.next_entry::<Cow<'_, str>, Cow<'_, str>>()? {
38            result.add_pair(element.0.as_ref(), element.1.as_ref());
39        }
40
41        Ok(result)
42    }
43
44    fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
45        let mut result = TwilioRequest::new();
46
47        //Cow - because deserialization might need decode special symbols
48        while let Some(element) = seq.next_element::<(Cow<'_, str>, Cow<'_, str>)>()? {
49            result.add_pair(element.0.as_ref(), element.1.as_ref());
50        }
51
52        Ok(result)
53    }
54}
55
56impl<'de> Deserialize<'de> for TwilioRequest {
57    #[inline]
58    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<TwilioRequest, D::Error> {
59        deserializer.deserialize_any(TwilioRequestVisitor)
60    }
61}
62
63impl<'a> Serialize for Mms<'a> {
64    #[inline]
65    fn serialize<S: serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
66        let mut ser = serializer.serialize_struct("Sms", 3)?;
67
68        ser.serialize_field("From", &self.sms.from)?;
69        ser.serialize_field("To", &self.sms.to)?;
70        ser.serialize_field("Body", &self.sms.body)?;
71        ser.serialize_field("MediaUrl", &self.media_url)?;
72        ser.end()
73    }
74}
75
76impl<'a> Serialize for Sms<'a> {
77    #[inline]
78    fn serialize<S: serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
79        let mut ser = serializer.serialize_struct("Sms", 3)?;
80
81        ser.serialize_field("From", &self.from)?;
82        ser.serialize_field("To", &self.to)?;
83        ser.serialize_field("Body", &self.body)?;
84        ser.end()
85    }
86}
87
88impl<'a> Serialize for Call<'a> {
89    #[inline]
90    fn serialize<S: serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
91        let mut ser = serializer.serialize_struct("Call", 3)?;
92
93        ser.serialize_field("From", &self.from)?;
94        ser.serialize_field("To", &self.to)?;
95        match self.instruction {
96            CallInstruction::Twiml(twiml) => ser.serialize_field("Twiml", twiml)?,
97            CallInstruction::Url(url) => ser.serialize_field("Url", url)?,
98        };
99        ser.end()
100    }
101}