messagebird_async/sms/
callbackurl.rs1use super::*;
2
3use std::fmt;
4
5use serde::de::{self, Deserialize, Deserializer, Unexpected, Visitor};
6use serde::ser::{Serialize, Serializer};
7
8#[derive(Debug, Eq, PartialEq)]
13pub struct CallbackUrl(Url);
14
15impl Serialize for CallbackUrl {
16 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17 where
18 S: Serializer,
19 {
20 serializer.serialize_str(self.0.as_str())
21 }
22}
23
24struct CallbackUrlVisitor;
25
26impl<'de> Visitor<'de> for CallbackUrlVisitor {
27 type Value = CallbackUrl;
28
29 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
30 formatter.write_str("a valid callback/href http url")
31 }
32
33 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
34 where
35 E: de::Error,
36 {
37 Url::parse(value)
38 .map(|url| CallbackUrl(url))
39 .map_err(|_e| de::Error::invalid_value(Unexpected::Str(value), &self))
40 }
41}
42
43impl<'de> Deserialize<'de> for CallbackUrl {
44 fn deserialize<D>(deserializer: D) -> Result<CallbackUrl, D::Error>
45 where
46 D: Deserializer<'de>,
47 {
48 deserializer.deserialize_str(CallbackUrlVisitor)
49 }
50}
51
52#[cfg(test)]
53mod test {
54 use super::*;
55
56 static RAW: &str = r#"
59"https://fun.with.https/"
60"#;
61
62 deser_roundtrip!(url_deser, CallbackUrl, RAW);
63 serde_roundtrip!(
64 url_serde,
65 CallbackUrl,
66 CallbackUrl(Url::parse("https://ahoi.io/messagebird/tracker/cb/").unwrap())
67 );
68}