page-turner 1.0.0

A generic abstraction of APIs with pagination
Documentation
use crate::local::{prelude::*, PageError, PageItems};
use crate::test_utils::*;
use futures::TryStreamExt;

#[tokio::test(flavor = "current_thread")]
async fn pages() {
    pages_base_test!().await;
    generic_pages_usage(NumbersClient::new(17, 3), GetNumbersQuery::default()).await;
}

#[tokio::test(flavor = "current_thread")]
async fn pages_ahead() {
    pages_ahead_base_test!().await;
    generic_pages_ahead_usage(BlogClient::new(49), GetContentRequest { page: 0 }).await;
}

#[tokio::test(flavor = "current_thread")]
async fn pages_ahead_unordered() {
    pages_ahead_unordered_base_test!().await;
    generic_pages_ahead_unordered_usage(BlogClient::new(49), GetContentRequest { page: 0 }).await;
}

page_turner_impls!();

async fn generic_pages_usage<P, R>(p: P, req: R)
where
    P: PageTurner<R>,
    PageItems<P, R>: IntoIterator,
    PageError<P, R>: std::fmt::Debug,
{
    let pages_stream = p.pages(req);
    generic_pages_stream_usage(pages_stream).await;
}

async fn generic_pages_ahead_usage<P, R>(p: P, req: R)
where
    P: PageTurner<R>,
    R: RequestAhead,
    PageItems<P, R>: IntoIterator,
    PageError<P, R>: std::fmt::Debug,
{
    let pages_stream = p.pages_ahead(2, Limit::None, req);
    generic_pages_stream_usage(pages_stream).await;
}

async fn generic_pages_ahead_unordered_usage<P, R>(p: P, req: R)
where
    P: PageTurner<R>,
    R: RequestAhead,
    PageItems<P, R>: IntoIterator,
    PageError<P, R>: std::fmt::Debug,
{
    let pages_stream = p.pages_ahead(2, Limit::None, req);
    generic_pages_stream_usage(pages_stream).await;
}

async fn generic_pages_stream_usage<'p, T, E>(s: impl 'p + PagesStream<'p, T, E>)
where
    T: IntoIterator,
    E: std::fmt::Debug,
{
    std::pin::pin!(s.items()).try_next().await.unwrap();
}

#[cfg(feature = "mutable")]
mod mutable {
    use crate::mutable::{prelude::*, PageError, PageItems};
    use crate::test_utils::*;
    use futures::TryStreamExt;

    #[tokio::test(flavor = "current_thread")]
    async fn pages() {
        pages_base_test!(mut).await;
        generic_pages_usage(NumbersClient::new(19, 5), GetNumbersQuery::default()).await;
    }

    page_turner_impls!(mut);

    async fn generic_pages_usage<P, R>(mut p: P, req: R)
    where
        P: PageTurner<R>,
        PageItems<P, R>: IntoIterator,
        PageError<P, R>: std::fmt::Debug,
    {
        let pages_stream = p.pages(req);
        generic_pages_stream_usage(pages_stream).await;
    }

    async fn generic_pages_stream_usage<'p, T, E>(s: impl 'p + PagesStream<'p, T, E>)
    where
        T: IntoIterator,
        E: std::fmt::Debug,
    {
        std::pin::pin!(s.items()).try_next().await.unwrap();
    }
}