use futures_core::Stream;
use crate::core::pagination::cursor_stream;
use crate::core::Result;
use super::generated::*;
use super::models::*;
use super::Reddit;
macro_rules! after_stream_no_path {
($(#[$m:meta])* $stream_fn:ident => $call_fn:ident, $params:ty, $field:ident, $item:ty) => {
$(#[$m])*
pub fn $stream_fn(&self, params: $params) -> impl Stream<Item = Result<$item>> {
let this = self.clone();
cursor_stream(None::<String>, move |after| {
let this = this.clone();
let mut params = params.clone();
async move {
params.after = after;
let page = this.$call_fn(params).await?;
let next = page.pagination.and_then(|p| p.after);
Ok((page.$field, next))
}
})
}
};
}
macro_rules! after_stream_path {
($(#[$m:meta])* $stream_fn:ident => $call_fn:ident, $arg:ident, $params:ty, $field:ident, $item:ty) => {
$(#[$m])*
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 |after| {
let this = this.clone();
let arg = arg.clone();
let mut params = params.clone();
async move {
params.after = after;
let page = this.$call_fn(&arg, params).await?;
let next = page.pagination.and_then(|p| p.after);
Ok((page.$field, next))
}
})
}
};
}
impl Reddit {
after_stream_path! {
get_subreddit_posts_stream => get_subreddit_posts, subreddit, GetSubredditPostsParams, posts, RedditPost
}
after_stream_path! {
get_user_posts_stream => get_user_posts, username, GetUserPostsParams, posts, RedditPost
}
after_stream_path! {
get_user_comments_stream => get_user_comments, username, GetUserCommentsParams, comments, RedditComment
}
after_stream_path! {
get_domain_posts_stream => get_domain_posts, domain, GetDomainPostsParams, posts, RedditPost
}
after_stream_no_path! {
search_posts_stream => search_posts, SearchPostsParams, posts, RedditPost
}
after_stream_no_path! {
search_subreddits_stream => search_subreddits, SearchSubredditsParams, subreddits, RedditSubreddit
}
after_stream_no_path! {
search_users_stream => search_users, SearchUsersParams, users, RedditUser
}
after_stream_no_path! {
get_new_subreddits_stream => get_new_subreddits, GetNewSubredditsParams, subreddits, RedditSubreddit
}
after_stream_no_path! {
get_popular_subreddits_stream => get_popular_subreddits, GetPopularSubredditsParams, subreddits, RedditSubreddit
}
after_stream_no_path! {
get_trending_posts_stream => get_trending_posts, GetTrendingPostsParams, posts, RedditPost
}
}