Trait AsyncPaginatedIterator

Source
pub trait AsyncPaginatedIterator<T> {
    // Required methods
    fn next<'life0, 'async_trait>(
        &'life0 mut self,
    ) -> Pin<Box<dyn Future<Output = Result<Option<T>>> + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn current_page(&self) -> u32;

    // Provided methods
    fn collect_all<'life0, 'async_trait>(
        &'life0 mut self,
    ) -> Pin<Box<dyn Future<Output = Result<Vec<T>>> + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait { ... }
    fn take<'life0, 'async_trait>(
        &'life0 mut self,
        n: usize,
    ) -> Pin<Box<dyn Future<Output = Result<Vec<T>>> + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait { ... }
}
Expand description

Async iterator trait for paginated Last.fm data.

This trait provides a common interface for iterating over paginated data from Last.fm, such as tracks, albums, and recent scrobbles. All iterators implement efficient streaming with automatic pagination and built-in rate limiting.

§Examples

use lastfm_edit::{LastFmEditClient, LastFmEditClientImpl, AsyncPaginatedIterator};

let mut client = LastFmEditClientImpl::new(Box::new(http_client::native::NativeClient::new()));
// client.login(...).await?;

let mut tracks = client.artist_tracks("Radiohead");

// Iterate one by one
while let Some(track) = tracks.next().await? {
    println!("{}", track.name);
}

// Or collect a limited number
let first_10 = tracks.take(10).await?;

Required Methods§

Source

fn next<'life0, 'async_trait>( &'life0 mut self, ) -> Pin<Box<dyn Future<Output = Result<Option<T>>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Fetch the next item from the iterator.

This method automatically handles pagination, fetching new pages as needed. Returns None when there are no more items available.

§Returns
  • Ok(Some(item)) - Next item in the sequence
  • Ok(None) - No more items available
  • Err(...) - Network or parsing error occurred
Source

fn current_page(&self) -> u32

Get the current page number (0-indexed).

Returns the page number of the most recently fetched page.

Provided Methods§

Source

fn collect_all<'life0, 'async_trait>( &'life0 mut self, ) -> Pin<Box<dyn Future<Output = Result<Vec<T>>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Collect all remaining items into a Vec.

Warning: This method will fetch ALL remaining pages, which could be many thousands of items for large libraries. Use take for safer bounded collection.

§Examples
let mut client = LastFmEditClientImpl::new(Box::new(http_client::native::NativeClient::new()));
let mut tracks = client.artist_tracks("Small Artist");
let all_tracks = tracks.collect_all().await?;
println!("Found {} tracks total", all_tracks.len());
Source

fn take<'life0, 'async_trait>( &'life0 mut self, n: usize, ) -> Pin<Box<dyn Future<Output = Result<Vec<T>>> + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Take up to n items from the iterator.

This is the recommended way to collect a bounded number of items from potentially large datasets.

§Arguments
  • n - Maximum number of items to collect
§Examples
let mut client = LastFmEditClientImpl::new(Box::new(http_client::native::NativeClient::new()));
let mut tracks = client.artist_tracks("Radiohead");
let top_20 = tracks.take(20).await?;
println!("Top 20 tracks: {:?}", top_20);

Implementors§