1use super::TwitterApi;
2use crate::api_result::ApiResult;
3use crate::authorization::Authorization;
4use crate::data::{
5 Bookmarked, Deleted, Hidden, Liked, Retweeted, StreamRule, Tweet, TweetsCount, User,
6};
7use crate::id::IntoNumericId;
8use crate::meta::{ResultCountMeta, SentMeta, TweetsCountsMeta, TweetsMeta};
9use crate::query::{
10 GetRelatedTweetsRequestBuilder, GetStreamRulesRequestBuilder, GetTimelineRequestBuilder,
11 GetTweetUsersRequestBuilder, GetTweetsCountsRequestBuilder, GetTweetsRequestBuilder,
12 GetTweetsSearchRequestBuilder, GetTweetsStreamRequestBuilder, UrlQueryExt,
13};
14use crate::requests::{StreamRuleBuilder, TweetBuilder, TweetId};
15use reqwest::Method;
16
17impl<A> TwitterApi<A>
18where
19 A: Authorization,
20{
21 pub fn get_tweets(
22 &self,
23 ids: impl IntoIterator<Item = impl IntoNumericId>,
24 ) -> GetTweetsRequestBuilder<A, Vec<Tweet>, ()> {
25 let mut url = self.url("tweets").unwrap();
26 url.append_query_seq("ids", ids);
27 GetTweetsRequestBuilder::new(self, url)
28 }
29 pub fn get_tweet(&self, id: impl IntoNumericId) -> GetTweetsRequestBuilder<A, Tweet, ()> {
30 GetTweetsRequestBuilder::new(self, self.url(format!("tweets/{id}")).unwrap())
31 }
32 pub fn post_tweet(&self) -> TweetBuilder<A> {
33 TweetBuilder::new(self, self.url("tweets").unwrap())
34 }
35 pub async fn delete_tweet(&self, id: impl IntoNumericId) -> ApiResult<A, Deleted, ()> {
36 self.send(self.request(Method::DELETE, self.url(format!("tweets/{id}"))?))
37 .await
38 }
39 pub fn get_user_tweets(
40 &self,
41 user_id: impl IntoNumericId,
42 ) -> GetTimelineRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
43 GetTimelineRequestBuilder::new(self, self.url(format!("users/{user_id}/tweets")).unwrap())
44 }
45 pub fn get_user_mentions(
46 &self,
47 user_id: impl IntoNumericId,
48 ) -> GetTimelineRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
49 GetTimelineRequestBuilder::new(self, self.url(format!("users/{user_id}/mentions")).unwrap())
50 }
51 pub fn get_tweets_search_recent(
52 &self,
53 query: impl ToString,
54 ) -> GetTweetsSearchRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
55 let mut url = self.url("tweets/search/recent").unwrap();
56 url.append_query_val("query", query);
57 GetTweetsSearchRequestBuilder::new(self, url)
58 }
59 pub fn get_tweets_search_all(
60 &self,
61 query: impl ToString,
62 ) -> GetTweetsSearchRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
63 let mut url = self.url("tweets/search/all").unwrap();
64 url.append_query_val("query", query);
65 GetTweetsSearchRequestBuilder::new(self, url)
66 }
67 pub fn get_tweets_counts_recent(
68 &self,
69 query: impl ToString,
70 ) -> GetTweetsCountsRequestBuilder<A, Vec<TweetsCount>, TweetsCountsMeta> {
71 let mut url = self.url("tweets/counts/recent").unwrap();
72 url.append_query_val("query", query);
73 GetTweetsCountsRequestBuilder::new(self, url)
74 }
75 pub fn get_tweets_counts_all(
76 &self,
77 query: impl ToString,
78 ) -> GetTweetsCountsRequestBuilder<A, Vec<TweetsCount>, TweetsCountsMeta> {
79 let mut url = self.url("tweets/counts/all").unwrap();
80 url.append_query_val("query", query);
81 GetTweetsCountsRequestBuilder::new(self, url)
82 }
83 pub fn get_tweets_search_stream_rules(
84 &self,
85 ) -> GetStreamRulesRequestBuilder<A, Vec<StreamRule>, SentMeta> {
86 GetStreamRulesRequestBuilder::new(self, self.url("tweets/search/stream/rules").unwrap())
87 }
88 pub fn get_tweets_search_stream(&self) -> GetTweetsStreamRequestBuilder<A, Tweet, SentMeta> {
89 GetTweetsStreamRequestBuilder::new(self, self.url("tweets/search/stream").unwrap())
90 }
91 pub fn post_tweets_search_stream_rule(&self) -> StreamRuleBuilder<A> {
92 StreamRuleBuilder::new(self, self.url("tweets/search/stream/rules").unwrap())
93 }
94 pub fn get_tweets_sample_stream(&self) -> GetTweetsStreamRequestBuilder<A, Tweet, SentMeta> {
95 GetTweetsStreamRequestBuilder::new(self, self.url("tweets/sample/stream").unwrap())
96 }
97 pub fn get_tweet_retweeted_by(
98 &self,
99 id: impl IntoNumericId,
100 ) -> GetTweetUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
101 GetTweetUsersRequestBuilder::new(
102 self,
103 self.url(format!("tweets/{id}/retweeted_by")).unwrap(),
104 )
105 }
106 pub async fn post_user_retweet(
107 &self,
108 user_id: impl IntoNumericId,
109 tweet_id: impl IntoNumericId,
110 ) -> ApiResult<A, Retweeted, ()> {
111 self.send(
112 self.request(Method::POST, self.url(format!("users/{user_id}/retweets"))?)
113 .json(&TweetId::from(tweet_id)),
114 )
115 .await
116 }
117 pub async fn delete_user_retweet(
118 &self,
119 user_id: impl IntoNumericId,
120 tweet_id: impl IntoNumericId,
121 ) -> ApiResult<A, Retweeted, ()> {
122 self.send(self.request(
123 Method::DELETE,
124 self.url(format!("users/{user_id}/retweets/{tweet_id}"))?,
125 ))
126 .await
127 }
128 pub fn get_tweet_quote_tweets(
129 &self,
130 id: impl IntoNumericId,
131 ) -> GetRelatedTweetsRequestBuilder<A, Vec<Tweet>, ResultCountMeta> {
132 GetRelatedTweetsRequestBuilder::new(
133 self,
134 self.url(format!("tweets/{id}/quote_tweets")).unwrap(),
135 )
136 }
137 pub fn get_tweet_liking_users(
138 &self,
139 id: impl IntoNumericId,
140 ) -> GetTweetUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
141 GetTweetUsersRequestBuilder::new(
142 self,
143 self.url(format!("tweets/{id}/liking_users")).unwrap(),
144 )
145 }
146 pub fn get_user_liked_tweets(
147 &self,
148 id: impl IntoNumericId,
149 ) -> GetRelatedTweetsRequestBuilder<A, Vec<Tweet>, ResultCountMeta> {
150 GetRelatedTweetsRequestBuilder::new(
151 self,
152 self.url(format!("users/{id}/liked_tweets")).unwrap(),
153 )
154 }
155 pub async fn post_user_like(
156 &self,
157 user_id: impl IntoNumericId,
158 tweet_id: impl IntoNumericId,
159 ) -> ApiResult<A, Liked, ()> {
160 self.send(
161 self.request(Method::POST, self.url(format!("users/{user_id}/likes"))?)
162 .json(&TweetId::from(tweet_id)),
163 )
164 .await
165 }
166 pub async fn delete_user_like(
167 &self,
168 user_id: impl IntoNumericId,
169 tweet_id: impl IntoNumericId,
170 ) -> ApiResult<A, Liked, ()> {
171 self.send(self.request(
172 Method::DELETE,
173 self.url(format!("users/{user_id}/likes/{tweet_id}"))?,
174 ))
175 .await
176 }
177 pub fn get_user_bookmarks(
178 &self,
179 id: impl IntoNumericId,
180 ) -> GetRelatedTweetsRequestBuilder<A, Vec<Tweet>, ResultCountMeta> {
181 GetRelatedTweetsRequestBuilder::new(
182 self,
183 self.url(format!("users/{id}/bookmarks")).unwrap(),
184 )
185 }
186 pub async fn post_user_bookmark(
187 &self,
188 user_id: impl IntoNumericId,
189 tweet_id: impl IntoNumericId,
190 ) -> ApiResult<A, Bookmarked, ()> {
191 self.send(
192 self.request(
193 Method::POST,
194 self.url(format!("users/{user_id}/bookmarks"))?,
195 )
196 .json(&TweetId::from(tweet_id)),
197 )
198 .await
199 }
200 pub async fn delete_user_bookmark(
201 &self,
202 user_id: impl IntoNumericId,
203 tweet_id: impl IntoNumericId,
204 ) -> ApiResult<A, Bookmarked, ()> {
205 self.send(self.request(
206 Method::DELETE,
207 self.url(format!("users/{user_id}/bookmarks/{tweet_id}"))?,
208 ))
209 .await
210 }
211 pub async fn put_tweet_hidden(
212 &self,
213 id: impl IntoNumericId,
214 hidden: bool,
215 ) -> ApiResult<A, Hidden, ()> {
216 self.send(
217 self.request(Method::PUT, self.url(format!("tweets/{id}/hidden"))?)
218 .json(&Hidden::from(hidden)),
219 )
220 .await
221 }
222}