misskey_api/endpoint/antennas/
create.rs

1#[cfg(feature = "12-10-0")]
2use crate::model::user_group::UserGroup;
3use crate::model::{
4    antenna::{Antenna, AntennaSource},
5    id::Id,
6    query::Query,
7    user_list::UserList,
8};
9
10use serde::Serialize;
11use typed_builder::TypedBuilder;
12
13#[derive(Serialize, Debug, Clone, TypedBuilder)]
14#[serde(rename_all = "camelCase")]
15#[builder(doc)]
16pub struct Request {
17    /// [ 1 .. 100 ] characters
18    #[builder(setter(into))]
19    pub name: String,
20    pub src: AntennaSource,
21    #[builder(default, setter(strip_option))]
22    pub user_list_id: Option<Id<UserList>>,
23    #[cfg(feature = "12-10-0")]
24    #[cfg_attr(docsrs, doc(cfg(feature = "12-10-0")))]
25    #[builder(default, setter(strip_option))]
26    pub user_group_id: Option<Id<UserGroup>>,
27    #[builder(default, setter(into))]
28    pub keywords: Query<String>,
29    #[cfg(feature = "12-19-0")]
30    #[cfg_attr(docsrs, doc(cfg(feature = "12-19-0")))]
31    #[builder(default, setter(into))]
32    pub exclude_keywords: Query<String>,
33    pub users: Vec<String>,
34    pub case_sensitive: bool,
35    pub with_replies: bool,
36    pub with_file: bool,
37    pub notify: bool,
38}
39
40impl misskey_core::Request for Request {
41    type Response = Antenna;
42    const ENDPOINT: &'static str = "antennas/create";
43}
44
45#[cfg(test)]
46mod tests {
47    use super::Request;
48    use crate::test::{ClientExt, TestClient};
49
50    #[tokio::test]
51    async fn request_all() {
52        use crate::model::{antenna::AntennaSource, query::Query};
53
54        let client = TestClient::new();
55        client
56            .test(Request {
57                // random 100 chars
58                name: "z0LnEV7NljIUEFFBkjTMW7BN2f6GhfnkbjrNWTqsPikqBzbd02jAvN1axE9h9ZyYCIklKt4WIeeyCNxB31TxJW6hJyHAJVnjTPJC".to_string(),
59                src: AntennaSource::All,
60                user_list_id: None,
61                #[cfg(feature = "12-10-0")]
62                user_group_id: None,
63                keywords: Query::from_vec(vec![vec!["hello".to_string(), "awesome".to_string()]]),
64                #[cfg(feature = "12-19-0")]
65                exclude_keywords: Query::from_vec(vec![vec!["no".to_string()]]),
66                users: Vec::new(),
67                case_sensitive: false,
68                with_replies: false,
69                with_file: false,
70                notify: false,
71            })
72            .await;
73    }
74
75    #[tokio::test]
76    async fn request_home() {
77        use crate::model::{antenna::AntennaSource, query::Query};
78
79        let client = TestClient::new();
80        client
81            .test(Request {
82                name: "test".to_string(),
83                src: AntennaSource::Home,
84                user_list_id: None,
85                #[cfg(feature = "12-10-0")]
86                user_group_id: None,
87                keywords: Query::from_vec(vec![vec!["hey".to_string()], vec!["wow".to_string()]]),
88                #[cfg(feature = "12-19-0")]
89                exclude_keywords: Query::default(),
90                users: Vec::new(),
91                case_sensitive: true,
92                with_replies: false,
93                with_file: false,
94                notify: false,
95            })
96            .await;
97    }
98
99    #[tokio::test]
100    async fn request_list() {
101        use crate::model::{antenna::AntennaSource, query::Query};
102
103        let client = TestClient::new();
104        let list = client
105            .test(crate::endpoint::users::lists::create::Request {
106                name: "test".to_string(),
107            })
108            .await;
109
110        client
111            .test(Request {
112                name: "test".to_string(),
113                src: AntennaSource::List,
114                user_list_id: Some(list.id),
115                #[cfg(feature = "12-10-0")]
116                user_group_id: None,
117                keywords: Query::from_vec(vec![
118                    vec!["kawaii".to_string()],
119                    vec!["cute".to_string()],
120                ]),
121                #[cfg(feature = "12-19-0")]
122                exclude_keywords: Query::from_vec(vec![
123                    vec!["sensitive".to_string()],
124                    vec!["violence".to_string()],
125                ]),
126                users: Vec::new(),
127                case_sensitive: false,
128                with_replies: true,
129                with_file: true,
130                notify: false,
131            })
132            .await;
133    }
134
135    #[tokio::test]
136    #[cfg(feature = "12-10-0")]
137    async fn request_group() {
138        use crate::model::{antenna::AntennaSource, query::Query};
139
140        let client = TestClient::new();
141        let group = client
142            .test(crate::endpoint::users::groups::create::Request {
143                name: "test".to_string(),
144            })
145            .await;
146
147        client
148            .test(Request {
149                name: "test".to_string(),
150                src: AntennaSource::Group,
151                user_list_id: None,
152                user_group_id: Some(group.id),
153                keywords: Query::from_vec(vec![
154                    vec!["kawaii".to_string()],
155                    vec!["cute".to_string()],
156                ]),
157                #[cfg(feature = "12-19-0")]
158                exclude_keywords: Query::default(),
159                users: Vec::new(),
160                case_sensitive: false,
161                with_replies: true,
162                with_file: true,
163                notify: false,
164            })
165            .await;
166    }
167
168    #[tokio::test]
169    async fn request_users() {
170        use crate::model::{antenna::AntennaSource, query::Query};
171
172        let client = TestClient::new();
173        let admin = client.admin.me().await;
174
175        client
176            .user
177            .test(Request {
178                name: "test".to_string(),
179                src: AntennaSource::Users,
180                user_list_id: None,
181                #[cfg(feature = "12-10-0")]
182                user_group_id: None,
183                keywords: Query::from_vec(vec![
184                    vec!["annoucement".to_string()],
185                    vec!["notice".to_string()],
186                ]),
187                #[cfg(feature = "12-19-0")]
188                exclude_keywords: Query::default(),
189                users: vec![admin.username],
190                case_sensitive: false,
191                with_replies: true,
192                with_file: false,
193                notify: true,
194            })
195            .await;
196    }
197}