sendgrid_async/sendgrid/
personalization.rs

1use serde::Serialize;
2use std::collections::HashMap;
3
4/// A personalization block for a V3 message. It has to at least contain one super::Address as a to
5/// address. All other fields are optional.
6#[derive(Default, Serialize)]
7pub struct Personalization {
8    to: Vec<super::Address>,
9
10    #[serde(skip_serializing_if = "Option::is_none")]
11    cc: Option<Vec<super::Address>>,
12
13    #[serde(skip_serializing_if = "Option::is_none")]
14    bcc: Option<Vec<super::Address>>,
15
16    #[serde(skip_serializing_if = "Option::is_none")]
17    subject: Option<String>,
18
19    #[serde(skip_serializing_if = "Option::is_none")]
20    headers: Option<HashMap<String, String>>,
21
22    #[serde(skip_serializing_if = "Option::is_none")]
23    substitutions: Option<HashMap<String, String>>,
24
25    #[serde(skip_serializing_if = "Option::is_none")]
26    custom_args: Option<HashMap<String, String>>,
27
28    #[serde(skip_serializing_if = "Option::is_none")]
29    dynamic_template_data: Option<serde_json::Value>,
30
31    #[serde(skip_serializing_if = "Option::is_none")]
32    send_at: Option<u64>,
33}
34
35impl Personalization {
36    /// Construct a new personalization block for this message.
37    pub fn new() -> Personalization {
38        Personalization::default()
39    }
40
41    /// Add a to field.
42    pub fn add_to(mut self, to: super::Address) -> Personalization {
43        self.to.push(to);
44        self
45    }
46
47    /// Add a CC field.
48    pub fn add_cc(mut self, cc: super::Address) -> Personalization {
49        match self.cc {
50            None => {
51                let mut ccs = Vec::new();
52                ccs.push(cc);
53                self.cc = Some(ccs);
54            }
55            Some(ref mut c) => {
56                c.push(cc);
57            }
58        }
59        self
60    }
61
62    /// Add a BCC field.
63    pub fn add_bcc(mut self, bcc: super::Address) -> Personalization {
64        match self.bcc {
65            None => {
66                let mut bccs = Vec::new();
67                bccs.push(bcc);
68                self.bcc = Some(bccs);
69            }
70            Some(ref mut b) => {
71                b.push(bcc);
72            }
73        }
74        self
75    }
76
77    /// Add a headers field.
78    pub fn add_headers(mut self, headers: HashMap<String, String>) -> Personalization {
79        match self.headers {
80            None => {
81                let mut h = HashMap::new();
82                for (name, value) in headers {
83                    h.insert(name, value);
84                }
85                self.headers = Some(h);
86            }
87            Some(ref mut h) => {
88                h.extend(headers);
89            }
90        }
91        self
92    }
93
94    /// Add a dynamic template data field.
95    pub fn set_dynamic_template_data(
96        mut self,
97        dynamic_template_data: impl Serialize,
98    ) -> Result<Personalization, serde_json::Error> {
99        let value = serde_json::to_value(dynamic_template_data)?;
100        self.dynamic_template_data = Some(value);
101        Ok(self)
102    }
103}