pushover_rs/pushover/data/
attachment_message_builder.rs1use std::io::Error;
2use std::io::ErrorKind;
3use crate::pushover::constants;
4
5use super::PushoverSound;
6use super::AttachmentMessage;
7
8pub struct AttachmentMessageBuilder {
14 build: AttachmentMessage,
15}
16
17impl AttachmentMessageBuilder {
18 pub fn new(user_key: &str, application_token: &str, message: &str) -> Self {
20 let mut build = AttachmentMessage::default();
21
22 build.user_key = user_key.to_owned();
23 build.app_token = application_token.to_owned();
24 build.message = message.to_owned();
25
26 AttachmentMessageBuilder {
27 build,
28 }
29 }
30
31 pub fn modify_message(mut self, message: &str) -> AttachmentMessageBuilder {
33 if message.trim().len() == 0 {
34 return self;
35 }
36
37 self.build.message = message.to_owned();
38 self
39 }
40
41 pub fn set_title(mut self, title: &str) -> AttachmentMessageBuilder {
43 if title.trim().len() == 0 {
44 self.build.title = None;
45 }
46
47 self.build.title = Some(title.to_owned());
48 self
49 }
50
51 #[deprecated(since="0.3.12", note="Please use set_title instead.")]
53 pub fn add_title(mut self, title: &str) -> AttachmentMessageBuilder {
54 if title.trim().len() == 0 {
55 self.build.title = None;
56 }
57
58 self.build.title = Some(title.to_owned());
59 self
60 }
61
62 pub fn remove_title(mut self) -> AttachmentMessageBuilder {
64 self.build.title = None;
65 self
66 }
67
68 pub fn set_url(mut self, url: &str, url_title: Option<&str>) -> AttachmentMessageBuilder {
72 if url.trim().len() == 0 {
73 self.build.url = None;
74 self.build.url_title = None;
75 return self;
76 }
77
78 self.build.url = Some(url.to_owned());
79
80 if url_title.is_some() {
81 self.build.url_title = Some(url_title.unwrap().to_owned());
82 }
83
84 self
85 }
86
87 #[deprecated(since="0.3.12", note="Please use set_url instead.")]
91 pub fn add_url(mut self, url: &str, url_title: Option<&str>) -> AttachmentMessageBuilder {
92 if url.trim().len() == 0 {
93 self.build.url = None;
94 self.build.url_title = None;
95 return self;
96 }
97
98 self.build.url = Some(url.to_owned());
99
100 if url_title.is_some() {
101 self.build.url_title = Some(url_title.unwrap().to_owned());
102 }
103
104 self
105 }
106
107 pub fn remove_url(mut self) -> AttachmentMessageBuilder {
109 self.build.url = None;
110 self.build.url_title = None;
111 self
112 }
113
114 pub fn set_priority(mut self, priority: i8) -> AttachmentMessageBuilder {
116 if priority < -2 || priority > 2 {
117 self.build.priority = Some("0".into());
118 return self;
119 }
120
121 self.build.priority = Some(priority.to_string());
122 self
123 }
124
125 pub fn remove_priority(mut self) -> AttachmentMessageBuilder {
127 self.build.priority = Some("0".into());
128 self.build.retry = None;
129 self.build.expire = None;
130 self
131 }
132
133 pub fn set_retry(mut self, retry_secs: i32) -> AttachmentMessageBuilder {
135 if self.build.priority != Some("2".into()) {
136 return self;
138 }
139
140 if retry_secs < 30 {
141 self.build.retry = Some("30".into());
142 return self;
143 }
144
145 self.build.retry = Some(retry_secs.to_string());
146 self
147 }
148
149 pub fn set_expire(mut self, expire_secs: i32) -> AttachmentMessageBuilder {
151 if self.build.priority != Some("2".into()) {
152 return self;
154 }
155
156 if expire_secs < 60 {
157 self.build.expire = Some("60".into());
158 return self;
159 }
160 else if expire_secs > 10800 {
161 self.build.expire = Some("10800".into());
162 return self;
163 }
164
165 self.build.expire = Some(expire_secs.to_string());
166 self
167 }
168
169 pub fn set_sound(mut self, sound: PushoverSound) -> AttachmentMessageBuilder {
173 self.build.sound = Some(sound.to_string());
174 self
175 }
176
177 pub fn remove_sound(mut self) -> AttachmentMessageBuilder {
179 self.build.sound = None;
180 self
181 }
182
183 pub fn set_timestamp(mut self, unix_timestamp: u64) -> AttachmentMessageBuilder {
185 self.build.timestamp = Some(unix_timestamp.to_string());
186 self
187 }
188
189 pub fn remove_timestamp(mut self) -> AttachmentMessageBuilder {
191 self.build.timestamp = None;
192 self
193 }
194
195 pub fn set_device(mut self, device_name: &str) -> AttachmentMessageBuilder {
199 self.build.device = Some(device_name.to_string());
200 self
201 }
202
203 pub fn remove_device(mut self) -> AttachmentMessageBuilder {
205 self.build.device = None;
206 self
207 }
208
209 pub fn set_ttl(mut self, ttl_secs: u32) -> AttachmentMessageBuilder {
211 if ttl_secs <= 0 {
212 self.build.ttl = None;
213 }
214 else {
215 self.build.ttl = Some(ttl_secs);
216 }
217 self
218 }
219
220 pub fn set_attachment(mut self, attachment_path: String) -> AttachmentMessageBuilder {
226 if attachment_path.trim().len() == 0 {
227 return self;
228 }
229
230 self.build.attachment = attachment_path;
231 self
232 }
233
234 pub fn build(mut self) -> Result<AttachmentMessage, Box<dyn std::error::Error>> {
236 if self.build.priority == Some("2".into()) {
237 if self.build.retry.is_none() {
238 self.build.retry = Some("30".into());
239 }
240 if self.build.expire.is_none() {
241 self.build.expire = Some("10800".into());
242 }
243 }
244
245 if self.build.app_token.is_empty() {
246 return Err(Box::new(Error::new(ErrorKind::InvalidInput, "Application token is empty")));
247 }
248
249 if self.build.user_key.is_empty() {
250 return Err(Box::new(Error::new(ErrorKind::InvalidInput, "User key is empty")));
251 }
252
253 if self.build.message.is_empty() {
254 return Err(Box::new(Error::new(ErrorKind::InvalidInput, "Message is empty")));
255 }
256
257 if self.build.attachment.is_empty() {
258 return Err(Box::new(Error::new(ErrorKind::InvalidInput, "Attachment is empty")));
259 }
260
261 if !std::path::Path::new(&self.build.attachment).exists() {
263 return Err(Box::new(Error::new(ErrorKind::InvalidInput, "Attachment file doesn't exist.")));
264 }
265
266 let file_size = std::fs::metadata(&self.build.attachment).unwrap().len();
268 if file_size > constants::PUSHOVER_API_ATTACHMENT_MAX_SIZE_BYTES {
269 return Err(Box::new(Error::new(ErrorKind::InvalidInput, "Attachment file is too large. (> 2621440 bytes)")));
270 }
271
272 Ok(self.build.clone())
273 }
274}