elefren/requests/
filter.rs

1use entities::filter::FilterContext;
2use std::time::Duration;
3
4/// Form used to create a filter
5///
6/// # Example
7///
8/// ```
9/// # extern crate elefren;
10/// # use std::error::Error;
11/// use elefren::{entities::filter::FilterContext, requests::AddFilterRequest};
12/// # fn main() -> Result<(), Box<Error>> {
13/// let request = AddFilterRequest::new("foo", FilterContext::Home);
14/// #   Ok(())
15/// # }
16/// ```
17#[derive(Debug, Clone, PartialEq, Serialize)]
18pub struct AddFilterRequest {
19    phrase: String,
20    context: FilterContext,
21    irreversible: Option<bool>,
22    whole_word: Option<bool>,
23    #[serde(serialize_with = "serialize_duration::ser")]
24    expires_in: Option<Duration>,
25}
26
27impl AddFilterRequest {
28    /// Create a new AddFilterRequest
29    pub fn new(phrase: &str, context: FilterContext) -> AddFilterRequest {
30        AddFilterRequest {
31            phrase: phrase.to_string(),
32            context,
33            irreversible: None,
34            whole_word: None,
35            expires_in: None,
36        }
37    }
38
39    /// Set `irreversible` to `true`
40    pub fn irreversible(&mut self) -> &mut Self {
41        self.irreversible = Some(true);
42        self
43    }
44
45    /// Set `whole_word` to `true`
46    pub fn whole_word(&mut self) -> &mut Self {
47        self.whole_word = Some(true);
48        self
49    }
50
51    /// Set `expires_in` to a duration
52    pub fn expires_in(&mut self, d: Duration) -> &mut Self {
53        self.expires_in = Some(d);
54        self
55    }
56}
57
58mod serialize_duration {
59    use serde::ser::Serializer;
60    use std::time::Duration;
61
62    pub(crate) fn ser<S>(duration: &Option<Duration>, s: S) -> Result<S::Ok, S::Error>
63    where
64        S: Serializer,
65    {
66        if let Some(d) = duration {
67            let sec = d.as_secs();
68            s.serialize_u64(sec)
69        } else {
70            s.serialize_none()
71        }
72    }
73}
74
75#[cfg(test)]
76mod tests {
77    use super::*;
78    use serde_json;
79    use std::time::Duration;
80
81    #[test]
82    fn test_new() {
83        let request = AddFilterRequest::new("foo", FilterContext::Home);
84        assert_eq!(
85            request,
86            AddFilterRequest {
87                phrase: "foo".to_string(),
88                context: FilterContext::Home,
89                irreversible: None,
90                whole_word: None,
91                expires_in: None,
92            }
93        )
94    }
95
96    #[test]
97    fn test_irreversible() {
98        let mut request = AddFilterRequest::new("foo", FilterContext::Home);
99        request.irreversible();
100        assert_eq!(
101            request,
102            AddFilterRequest {
103                phrase: "foo".to_string(),
104                context: FilterContext::Home,
105                irreversible: Some(true),
106                whole_word: None,
107                expires_in: None,
108            }
109        )
110    }
111
112    #[test]
113    fn test_whole_word() {
114        let mut request = AddFilterRequest::new("foo", FilterContext::Home);
115        request.whole_word();
116        assert_eq!(
117            request,
118            AddFilterRequest {
119                phrase: "foo".to_string(),
120                context: FilterContext::Home,
121                irreversible: None,
122                whole_word: Some(true),
123                expires_in: None,
124            }
125        )
126    }
127
128    #[test]
129    fn test_expires_in() {
130        let mut request = AddFilterRequest::new("foo", FilterContext::Home);
131        request.expires_in(Duration::from_secs(300));
132        assert_eq!(
133            request,
134            AddFilterRequest {
135                phrase: "foo".to_string(),
136                context: FilterContext::Home,
137                irreversible: None,
138                whole_word: None,
139                expires_in: Some(Duration::from_secs(300)),
140            }
141        )
142    }
143
144    #[test]
145    fn test_serialize_request() {
146        let mut request = AddFilterRequest::new("foo", FilterContext::Home);
147        request.expires_in(Duration::from_secs(300));
148        let ser = serde_json::to_string(&request).expect("Couldn't serialize");
149        assert_eq!(
150            ser,
151            r#"{"phrase":"foo","context":"home","irreversible":null,"whole_word":null,"expires_in":300}"#
152        )
153    }
154}