Skip to main content

misskey_api/endpoint/notes/
search_by_tag.rs

1use crate::model::{
2    id::Id,
3    note::{Note, Tag},
4    query::Query,
5};
6
7use serde::Serialize;
8use typed_builder::TypedBuilder;
9
10#[derive(Serialize, Debug, Clone, TypedBuilder)]
11#[serde(rename_all = "camelCase")]
12#[builder(doc)]
13pub struct Request {
14    #[serde(skip_serializing_if = "Option::is_none")]
15    #[builder(default, setter(strip_option))]
16    pub tag: Option<Tag>,
17    #[serde(skip_serializing_if = "Option::is_none")]
18    #[builder(default, setter(strip_option, into))]
19    pub query: Option<Query<Tag>>,
20    #[builder(default, setter(strip_option))]
21    pub reply: Option<bool>,
22    #[builder(default, setter(strip_option))]
23    pub renote: Option<bool>,
24    #[builder(default, setter(strip_option))]
25    pub poll: Option<bool>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    #[builder(default, setter(strip_option))]
28    pub with_files: Option<bool>,
29    /// 1 .. 100 (1 .. 30 in ~12.19.0)
30    #[serde(skip_serializing_if = "Option::is_none")]
31    #[builder(default, setter(strip_option))]
32    pub limit: Option<u8>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    #[builder(default, setter(strip_option))]
35    pub since_id: Option<Id<Note>>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    #[builder(default, setter(strip_option))]
38    pub until_id: Option<Id<Note>>,
39}
40
41impl misskey_core::Request for Request {
42    type Response = Vec<Note>;
43    const ENDPOINT: &'static str = "notes/search-by-tag";
44}
45
46impl_pagination!(Request, Note);
47
48#[cfg(test)]
49mod tests {
50    use super::Request;
51    use crate::test::{ClientExt, TestClient};
52
53    #[tokio::test]
54    async fn request_with_tag() {
55        use crate::model::note::Tag;
56
57        let client = TestClient::new();
58        client
59            .test(Request {
60                tag: Some(Tag("tag".to_string())),
61                query: None,
62                reply: None,
63                renote: None,
64                poll: None,
65                with_files: None,
66                limit: None,
67                since_id: None,
68                until_id: None,
69            })
70            .await;
71    }
72
73    #[tokio::test]
74    async fn request_with_query() {
75        use crate::model::{note::Tag, query::Query};
76
77        let client = TestClient::new();
78        client
79            .test(Request {
80                tag: None,
81                query: Some(Query::from_vec(vec![
82                    vec![Tag("tag1".to_string()), Tag("tag2".to_string())],
83                    vec![Tag("tag3".to_string())],
84                ])),
85                reply: None,
86                renote: None,
87                poll: None,
88                with_files: None,
89                limit: None,
90                since_id: None,
91                until_id: None,
92            })
93            .await;
94    }
95
96    #[tokio::test]
97    async fn request_with_options() {
98        use crate::model::note::Tag;
99
100        let client = TestClient::new();
101        client
102            .test(Request {
103                tag: Some(Tag("tag".to_string())),
104                query: None,
105                reply: Some(true),
106                renote: Some(true),
107                poll: Some(true),
108                with_files: Some(true),
109                limit: None,
110                since_id: None,
111                until_id: None,
112            })
113            .await;
114    }
115
116    #[tokio::test]
117    async fn request_with_limit() {
118        use crate::model::note::Tag;
119
120        let client = TestClient::new();
121        client
122            .test(Request {
123                tag: Some(Tag("tag".to_string())),
124                query: None,
125                reply: None,
126                renote: None,
127                poll: None,
128                with_files: None,
129                limit: Some(30),
130                since_id: None,
131                until_id: None,
132            })
133            .await;
134    }
135
136    #[tokio::test]
137    async fn request_paginate() {
138        use crate::model::note::Tag;
139
140        let client = TestClient::new();
141        let note = client.create_note(Some("#tag"), None, None).await;
142
143        client
144            .test(Request {
145                tag: Some(Tag("tag".to_string())),
146                query: None,
147                reply: None,
148                renote: None,
149                poll: None,
150                with_files: None,
151                limit: None,
152                since_id: Some(note.id.clone()),
153                until_id: Some(note.id.clone()),
154            })
155            .await;
156    }
157}