elefren/requests/
filter.rs1use entities::filter::FilterContext;
2use std::time::Duration;
3
4#[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 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 pub fn irreversible(&mut self) -> &mut Self {
41 self.irreversible = Some(true);
42 self
43 }
44
45 pub fn whole_word(&mut self) -> &mut Self {
47 self.whole_word = Some(true);
48 self
49 }
50
51 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}