twitter_v2/api/
tweets.rs

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}