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 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 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}