Skip to main content

LinkPaginator

Struct LinkPaginator 

Source
pub struct LinkPaginator<T> { /* private fields */ }
Expand description

A manual async iterator over the pages of a Link-header-paginated collection.

Holds the [ClientCore] and the URL of the next page to fetch (if any). Each Self::next_page GETs the current URL, decodes its body as T, reads the response’s Link: <…>; rel="next" header to find the following page, and yields the decoded page. It returns None once a response carries no rel="next" link — or after any error, which terminates the paginator.

T is the decoded body type of one page: typically a Vec<Item> for an array collection, or a wrapper struct whose fields include the items. Dropping the paginator is safe (standard HTTP drop semantics).

Implementations§

Source§

impl<T> LinkPaginator<T>

Source

pub fn new(core: ClientCore, first: Url) -> Self

Seed a paginator from the URL of the first page. No request is made until the first Self::next_page call.

Source

pub fn from_headers(core: ClientCore, headers: &HeaderMap) -> Self

Seed a paginator from the headers of an already-fetched first response (the rel="next" link), so a caller who fetched page one through a normal operation method can continue from its headers. Only an absolute next URL is followed; a relative one yields no next page (use Self::new with the resolved URL instead).

Source

pub fn has_next(&self) -> bool

Whether another page will be fetched by the next Self::next_page call.

Source§

impl<T: DeserializeOwned> LinkPaginator<T>

Source

pub async fn next_page( &mut self, ) -> Option<Result<ResponseValue<T>, Error<Infallible>>>

Fetch and decode the next page, or return None at the end of the chain.

GETs the current next URL, parses its response Link header for rel="next" (resolving a relative target against the fetched URL) to arm the following page, then decodes the body as T. Three things terminate the paginator (subsequent calls return None):

  • a transport failure → Some(Err(..));
  • a non-success HTTP status (anything outside 2xx) → Some(Err(Error::UnexpectedStatus)) — the body is never decoded as T, so an error payload can’t masquerade as a page. The generic paginator has no per-operation error taxonomy, and it attaches no per-operation credentials, so a follow-up page that 401s (see the auth caveat in the module docs) surfaces here rather than being silently mis-decoded;
  • a decode failure on a 2xx body → Some(Err(Error::Decode)).

When a 2xx page carries no rel="next" link, the page is yielded and the following call returns None.

Auto Trait Implementations§

§

impl<T> !RefUnwindSafe for LinkPaginator<T>

§

impl<T> !UnwindSafe for LinkPaginator<T>

§

impl<T> Freeze for LinkPaginator<T>
where PhantomData<fn() -> T>: Freeze,

§

impl<T> Send for LinkPaginator<T>
where PhantomData<fn() -> T>: Send,

§

impl<T> Sync for LinkPaginator<T>
where PhantomData<fn() -> T>: Sync,

§

impl<T> Unpin for LinkPaginator<T>
where PhantomData<fn() -> T>: Unpin,

§

impl<T> UnsafeUnpin for LinkPaginator<T>
where PhantomData<fn() -> T>: UnsafeUnpin,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more