twitter-v2 0.1.8

Twitter API v2
Documentation
use super::TwitterApi;
use crate::api_result::ApiResult;
use crate::authorization::Authorization;
use crate::data::{
    Bookmarked, Deleted, Hidden, Liked, Retweeted, StreamRule, Tweet, TweetsCount, User,
};
use crate::id::IntoNumericId;
use crate::meta::{ResultCountMeta, SentMeta, TweetsCountsMeta, TweetsMeta};
use crate::query::{
    GetRelatedTweetsRequestBuilder, GetStreamRulesRequestBuilder, GetTimelineRequestBuilder,
    GetTweetUsersRequestBuilder, GetTweetsCountsRequestBuilder, GetTweetsRequestBuilder,
    GetTweetsSearchRequestBuilder, GetTweetsStreamRequestBuilder, UrlQueryExt,
};
use crate::requests::{StreamRuleBuilder, TweetBuilder, TweetId};
use reqwest::Method;

impl<A> TwitterApi<A>
where
    A: Authorization,
{
    pub fn get_tweets(
        &self,
        ids: impl IntoIterator<Item = impl IntoNumericId>,
    ) -> GetTweetsRequestBuilder<A, Vec<Tweet>, ()> {
        let mut url = self.url("tweets").unwrap();
        url.append_query_seq("ids", ids);
        GetTweetsRequestBuilder::new(self, url)
    }
    pub fn get_tweet(&self, id: impl IntoNumericId) -> GetTweetsRequestBuilder<A, Tweet, ()> {
        GetTweetsRequestBuilder::new(self, self.url(format!("tweets/{id}")).unwrap())
    }
    pub fn post_tweet(&self) -> TweetBuilder<A> {
        TweetBuilder::new(self, self.url("tweets").unwrap())
    }
    pub async fn delete_tweet(&self, id: impl IntoNumericId) -> ApiResult<A, Deleted, ()> {
        self.send(self.request(Method::DELETE, self.url(format!("tweets/{id}"))?))
            .await
    }
    pub fn get_user_tweets(
        &self,
        user_id: impl IntoNumericId,
    ) -> GetTimelineRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
        GetTimelineRequestBuilder::new(self, self.url(format!("users/{user_id}/tweets")).unwrap())
    }
    pub fn get_user_mentions(
        &self,
        user_id: impl IntoNumericId,
    ) -> GetTimelineRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
        GetTimelineRequestBuilder::new(self, self.url(format!("users/{user_id}/mentions")).unwrap())
    }
    pub fn get_tweets_search_recent(
        &self,
        query: impl ToString,
    ) -> GetTweetsSearchRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
        let mut url = self.url("tweets/search/recent").unwrap();
        url.append_query_val("query", query);
        GetTweetsSearchRequestBuilder::new(self, url)
    }
    pub fn get_tweets_search_all(
        &self,
        query: impl ToString,
    ) -> GetTweetsSearchRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
        let mut url = self.url("tweets/search/all").unwrap();
        url.append_query_val("query", query);
        GetTweetsSearchRequestBuilder::new(self, url)
    }
    pub fn get_tweets_counts_recent(
        &self,
        query: impl ToString,
    ) -> GetTweetsCountsRequestBuilder<A, Vec<TweetsCount>, TweetsCountsMeta> {
        let mut url = self.url("tweets/counts/recent").unwrap();
        url.append_query_val("query", query);
        GetTweetsCountsRequestBuilder::new(self, url)
    }
    pub fn get_tweets_counts_all(
        &self,
        query: impl ToString,
    ) -> GetTweetsCountsRequestBuilder<A, Vec<TweetsCount>, TweetsCountsMeta> {
        let mut url = self.url("tweets/counts/all").unwrap();
        url.append_query_val("query", query);
        GetTweetsCountsRequestBuilder::new(self, url)
    }
    pub fn get_tweets_search_stream_rules(
        &self,
    ) -> GetStreamRulesRequestBuilder<A, Vec<StreamRule>, SentMeta> {
        GetStreamRulesRequestBuilder::new(self, self.url("tweets/search/stream/rules").unwrap())
    }
    pub fn get_tweets_search_stream(&self) -> GetTweetsStreamRequestBuilder<A, Tweet, SentMeta> {
        GetTweetsStreamRequestBuilder::new(self, self.url("tweets/search/stream").unwrap())
    }
    pub fn post_tweets_search_stream_rule(&self) -> StreamRuleBuilder<A> {
        StreamRuleBuilder::new(self, self.url("tweets/search/stream/rules").unwrap())
    }
    pub fn get_tweets_sample_stream(&self) -> GetTweetsStreamRequestBuilder<A, Tweet, SentMeta> {
        GetTweetsStreamRequestBuilder::new(self, self.url("tweets/sample/stream").unwrap())
    }
    pub fn get_tweet_retweeted_by(
        &self,
        id: impl IntoNumericId,
    ) -> GetTweetUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
        GetTweetUsersRequestBuilder::new(
            self,
            self.url(format!("tweets/{id}/retweeted_by")).unwrap(),
        )
    }
    pub async fn post_user_retweet(
        &self,
        user_id: impl IntoNumericId,
        tweet_id: impl IntoNumericId,
    ) -> ApiResult<A, Retweeted, ()> {
        self.send(
            self.request(Method::POST, self.url(format!("users/{user_id}/retweets"))?)
                .json(&TweetId::from(tweet_id)),
        )
        .await
    }
    pub async fn delete_user_retweet(
        &self,
        user_id: impl IntoNumericId,
        tweet_id: impl IntoNumericId,
    ) -> ApiResult<A, Retweeted, ()> {
        self.send(self.request(
            Method::DELETE,
            self.url(format!("users/{user_id}/retweets/{tweet_id}"))?,
        ))
        .await
    }
    pub fn get_tweet_quote_tweets(
        &self,
        id: impl IntoNumericId,
    ) -> GetRelatedTweetsRequestBuilder<A, Vec<Tweet>, ResultCountMeta> {
        GetRelatedTweetsRequestBuilder::new(
            self,
            self.url(format!("tweets/{id}/quote_tweets")).unwrap(),
        )
    }
    pub fn get_tweet_liking_users(
        &self,
        id: impl IntoNumericId,
    ) -> GetTweetUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
        GetTweetUsersRequestBuilder::new(
            self,
            self.url(format!("tweets/{id}/liking_users")).unwrap(),
        )
    }
    pub fn get_user_liked_tweets(
        &self,
        id: impl IntoNumericId,
    ) -> GetRelatedTweetsRequestBuilder<A, Vec<Tweet>, ResultCountMeta> {
        GetRelatedTweetsRequestBuilder::new(
            self,
            self.url(format!("users/{id}/liked_tweets")).unwrap(),
        )
    }
    pub async fn post_user_like(
        &self,
        user_id: impl IntoNumericId,
        tweet_id: impl IntoNumericId,
    ) -> ApiResult<A, Liked, ()> {
        self.send(
            self.request(Method::POST, self.url(format!("users/{user_id}/likes"))?)
                .json(&TweetId::from(tweet_id)),
        )
        .await
    }
    pub async fn delete_user_like(
        &self,
        user_id: impl IntoNumericId,
        tweet_id: impl IntoNumericId,
    ) -> ApiResult<A, Liked, ()> {
        self.send(self.request(
            Method::DELETE,
            self.url(format!("users/{user_id}/likes/{tweet_id}"))?,
        ))
        .await
    }
    pub fn get_user_bookmarks(
        &self,
        id: impl IntoNumericId,
    ) -> GetRelatedTweetsRequestBuilder<A, Vec<Tweet>, ResultCountMeta> {
        GetRelatedTweetsRequestBuilder::new(
            self,
            self.url(format!("users/{id}/bookmarks")).unwrap(),
        )
    }
    pub async fn post_user_bookmark(
        &self,
        user_id: impl IntoNumericId,
        tweet_id: impl IntoNumericId,
    ) -> ApiResult<A, Bookmarked, ()> {
        self.send(
            self.request(
                Method::POST,
                self.url(format!("users/{user_id}/bookmarks"))?,
            )
            .json(&TweetId::from(tweet_id)),
        )
        .await
    }
    pub async fn delete_user_bookmark(
        &self,
        user_id: impl IntoNumericId,
        tweet_id: impl IntoNumericId,
    ) -> ApiResult<A, Bookmarked, ()> {
        self.send(self.request(
            Method::DELETE,
            self.url(format!("users/{user_id}/bookmarks/{tweet_id}"))?,
        ))
        .await
    }
    pub async fn put_tweet_hidden(
        &self,
        id: impl IntoNumericId,
        hidden: bool,
    ) -> ApiResult<A, Hidden, ()> {
        self.send(
            self.request(Method::PUT, self.url(format!("tweets/{id}/hidden"))?)
                .json(&Hidden::from(hidden)),
        )
        .await
    }
}