use futures_core::Stream;
use crate::core::pagination::cursor_stream;
use crate::core::Result;
use super::generated::*;
use super::Twitter;
macro_rules! cursor_stream_no_path {
($(#[$meta:meta])* $stream_fn:ident => $call_fn:ident, $params:ty, $item:ty) => {
$(#[$meta])*
pub fn $stream_fn(&self, params: $params) -> impl Stream<Item = Result<$item>> {
let this = self.clone();
cursor_stream(None::<String>, move |cursor| {
let this = this.clone();
let mut params = params.clone();
async move {
params.cursor = cursor;
let page = this.$call_fn(params).await?;
Ok((page.data.unwrap_or_default(), page.next_cursor))
}
})
}
};
}
macro_rules! cursor_stream_path {
($(#[$meta:meta])* $stream_fn:ident => $call_fn:ident, $arg:ident, $params:ty, $item:ty) => {
$(#[$meta])*
pub fn $stream_fn(
&self,
$arg: impl AsRef<str>,
params: $params,
) -> impl Stream<Item = Result<$item>> {
let this = self.clone();
let arg = $arg.as_ref().to_string();
cursor_stream(None::<String>, move |cursor| {
let this = this.clone();
let arg = arg.clone();
let mut params = params.clone();
async move {
params.cursor = cursor;
let page = this.$call_fn(&arg, params).await?;
Ok((page.data.unwrap_or_default(), page.next_cursor))
}
})
}
};
}
impl Twitter {
cursor_stream_no_path! {
advanced_search_tweets_stream => advanced_search_tweets, AdvancedSearchTweetsParams, TweetData
}
cursor_stream_no_path! {
search_users_stream => search_users, SearchUsersParams, UserData
}
cursor_stream_path! {
get_user_latest_tweets_stream => get_user_latest_tweets, username, GetUserLatestTweetsParams, TweetData
}
cursor_stream_path! {
get_user_mentions_stream => get_user_mentions, username, GetUserMentionsParams, TweetData
}
cursor_stream_path! {
get_user_followers_stream => get_user_followers, username, GetUserFollowersParams, UserData
}
cursor_stream_path! {
get_user_followings_stream => get_user_followings, username, GetUserFollowingsParams, UserData
}
cursor_stream_path! {
get_user_subscriptions_stream => get_user_subscriptions, user_id, GetUserSubscriptionsParams, UserData
}
cursor_stream_path! {
get_user_articles_stream => get_user_articles, user_id, GetUserArticlesParams, ArticleData
}
cursor_stream_path! {
get_tweet_replies_stream => get_tweet_replies, tweet_id, GetTweetRepliesParams, TweetData
}
cursor_stream_path! {
get_tweet_quotes_stream => get_tweet_quotes, tweet_id, GetTweetQuotesParams, TweetData
}
cursor_stream_path! {
get_tweet_retweeters_stream => get_tweet_retweeters, tweet_id, GetTweetRetweetersParams, UserData
}
cursor_stream_path! {
get_tweet_favoriters_stream => get_tweet_favoriters, tweet_id, GetTweetFavoritersParams, UserData
}
cursor_stream_path! {
get_community_tweets_stream => get_community_tweets, community_id, GetCommunityTweetsParams, TweetData
}
cursor_stream_path! {
get_list_tweets_stream => get_list_tweets, list_id, GetListTweetsParams, TweetData
}
cursor_stream_path! {
search_list_tweets_stream => search_list_tweets, list_id, SearchListTweetsParams, TweetData
}
}