misskey_api/endpoint/notes/
search_by_tag.rs1use 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 #[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}