messagebird_async/sms/parameter/
send.rs

1use super::*;
2
3/// SendParameters is an object that can be passed on to MessageBird API to trigger sending a SMS
4#[derive(Debug, Serialize, Eq, PartialEq)]
5pub struct SendParameters {
6    // mandatory
7    #[serde(rename = "originator")]
8    originator: Originator,
9    #[serde(rename = "body")]
10    payload: Payload,
11    // TODO this can actually be a mixture of Msisdns and group ids
12    #[serde(rename = "recipients")]
13    recipients: Vec<QueryRecipient>,
14    // optionals, which should just not be there compared to : null
15    #[serde(rename = "type")]
16    payload_type: Option<PayloadType>,
17    #[serde(flatten)]
18    #[serde(rename = "reference")]
19    reference: Option<String>,
20    #[serde(flatten)]
21    #[serde(rename = "reportUrl")]
22    report_url: Option<CallbackUrl>,
23    #[serde(flatten)]
24    #[serde(rename = "validity")]
25    validity: Option<Duration>,
26    #[serde(flatten)]
27    #[serde(rename = "gateway")]
28    gateway: Option<Gateway>,
29    #[serde(rename = "typeDetails")]
30    details: Vec<TypeDetail>,
31    #[serde(rename = "datacoding")]
32    payload_encoding: Option<PayloadEncoding>,
33    #[serde(rename = "mclass")]
34    class: Option<MessageClass>,
35    #[serde(flatten)]
36    #[serde(rename = "scheduledDatetime")]
37    scheduled_datetime: Option<DateTime>,
38    // creation date is inferred by API usage
39}
40
41impl Default for SendParameters {
42    fn default() -> Self {
43        Self {
44            payload_type: None,
45            originator: Originator::default(),
46            payload: Payload::Text("This is a default message".to_string()),
47            reference: None,
48            report_url: None,
49            validity: None,
50            gateway: None,
51            details: vec![],
52            payload_encoding: None,
53            class: None,
54            scheduled_datetime: None,
55            recipients: vec![],
56        }
57    }
58}
59
60impl SendParameters {
61    pub fn builder() -> Builder {
62        Builder(SendParameters::default())
63    }
64}
65
66use std::fmt;
67use std::string::String;
68
69impl fmt::Display for SendParameters {
70    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
71        let base = String::from("https://rest.messagebird.com/messages");
72        let query = serde_url_params::to_string(self).unwrap();
73        write!(f, "{}?{}", base, query)
74    }
75}
76
77impl Query for SendParameters {
78    fn uri(&self) -> hyper::Uri {
79        let uri: hyper::Uri = self
80            .to_string()
81            .parse()
82            .expect("Failed to parse send query object to hyper::Uri");
83        uri
84    }
85    fn method(&self) -> hyper::Method {
86        hyper::Method::POST
87    }
88}
89
90pub struct Builder(SendParameters);
91
92impl Builder {
93    pub fn payload(
94        mut self,
95        payload_type: PayloadType,
96        payload: Payload,
97        payload_encoding: PayloadEncoding,
98    ) -> Self {
99        self.0.payload_type = Some(payload_type);
100        self.0.payload_encoding = Some(payload_encoding);
101        self.0.payload = payload;
102        self
103    }
104    pub fn report_url(mut self, report_url: CallbackUrl) -> Self {
105        self.0.report_url = Some(report_url);
106        self
107    }
108    pub fn origin(mut self, originator: Originator) -> Self {
109        self.0.originator = originator;
110        self
111    }
112    pub fn add_recipient(mut self, recipient: QueryRecipient) -> Self {
113        self.0.recipients.push(recipient);
114        self
115    }
116    pub fn build(self) -> SendParameters {
117        self.0
118    }
119}
120
121#[cfg(test)]
122mod tests {
123
124    use super::*;
125    #[test]
126    fn query_send() {
127        let msisdns: Vec<Msisdn> =
128            vec![Msisdn::new(123475).unwrap(), Msisdn::new(12345677).unwrap()];
129        let url_params = SendParameters::builder()
130            .origin(AlphaNumeric::from_str("inbox").unwrap().into())
131            .payload(
132                PayloadType::Sms,
133                Payload::Text("fun".to_string()),
134                PayloadEncoding::Auto,
135            )
136            .add_recipient(msisdns[0].into())
137            .add_recipient(msisdns[1].into())
138            .build();
139        println!("send obj {:?}", url_params);
140        let url_params_str = serde_url_params::to_string(&url_params).unwrap();
141        println!("send params are \"{}\"", url_params_str);
142        assert_eq!(url_params.to_string(), "https://rest.messagebird.com/messages?originator=inbox&body=fun&recipients=123475&recipients=12345677&type=sms&datacoding=auto".to_string());
143    }
144}