Bekerja dengan operasi daftar

Beberapa layanan menampilkan daftar item yang berpotensi besar, seperti baris atau deskripsi resource. Untuk menjaga penggunaan CPU dan memori tetap terkendali, layanan menampilkan resource ini dalam pages: subkumpulan item yang lebih kecil dengan token kelanjutan untuk meminta subkumpulan berikutnya.

Melakukan iterasi pada item menurut halaman bisa jadi membosankan. Library klien menyediakan adaptor untuk mengonversi halaman menjadi iterator asinkron. Panduan ini menunjukkan cara menggunakan adapter ini.

Prasyarat

Panduan ini menggunakan layanan Secret Manager untuk mendemonstrasikan operasi list. Konsep yang disertakan dalam panduan ini juga berlaku untuk layanan lain.

Untuk mengikuti panduan ini, Anda harus mengaktifkan layanan Secret Manager, login, dan memastikan akun Anda memiliki izin yang diperlukan. Untuk mendapatkan panduan tentang cara memenuhi prasyarat ini, ikuti panduan memulai cepat layanan.

Untuk mengetahui petunjuk penyiapan lengkap untuk library Rust, lihat Menyiapkan lingkungan pengembangan Anda.

Dependensi

Tambahkan library Secret Manager ke file Cargo.toml Anda:

cargo add google-cloud-secretmanager-v1

Metode daftar iterasi

Untuk membantu mengulangi item dalam metode daftar, API menampilkan penerapan trait ItemPaginator. Perkenalkan trait ke dalam cakupan menggunakan deklarasi use:

use google_cloud_gax::paginator::ItemPaginator as _;

Untuk melakukan iterasi pada item, gunakan metode by_item.

let mut list = client
    .list_secrets()
    .set_parent(format!("projects/{project_id}"))
    .by_item();
while let Some(secret) = list.next().await {
    let secret = secret?;
    println!("  secret={}", secret.name)
}

Dalam kasus yang jarang terjadi, halaman mungkin berisi informasi tambahan yang perlu Anda akses, atau Anda mungkin perlu menandai progres di seluruh proses. Jika diperlukan, Anda dapat melakukan iterasi pada halaman lengkap, bukan item individual.

  1. Memperkenalkan Paginator ke dalam cakupan menggunakan deklarasi use:

    use google_cloud_gax::paginator::Paginator as _;

  2. Lakukan iterasi pada halaman menggunakan by_page:

    let mut list = client
        .list_secrets()
        .set_parent(format!("projects/{project_id}"))
        .by_page();
    while let Some(page) = list.next().await {
        let page = page?;
        println!("  next_page_token={}", page.next_page_token);
        page.secrets
            .into_iter()
            .for_each(|secret| println!("    secret={}", secret.name));
    }

Bekerja dengan futures::Stream

Anda mungkin ingin menggunakan API ini dalam ekosistem Rust yang lebih besar untuk aliran asinkron, seperti tokio::Stream. Hal ini dapat dilakukan sebagai berikut:

  1. Aktifkan fitur unstable-streams di crate google_cloud_gax. Nama fitur ini berfungsi sebagai pemberitahuan bahwa API ini tidak stabil. Anda hanya boleh menggunakannya jika Anda siap menangani gangguan apa pun yang diakibatkan oleh perubahan yang tidak kompatibel pada karakteristik futures::Stream.

    cargo add google-cloud-gax --features unstable-stream
    
  2. Contoh berikut juga menggunakan trait futures::stream::StreamExt, yang Anda aktifkan dengan menambahkan crate futures.

    cargo add futures
    
  3. Tambahkan deklarasi use yang diperlukan:

    use futures::stream::StreamExt;
    use google_cloud_gax::paginator::ItemPaginator as _;

  4. Gunakan fungsi into_stream untuk mengonversi ItemPaginator menjadi futures::Stream.

    let list = client
        .list_secrets()
        .set_parent(format!("projects/{project_id}"))
        .by_item()
        .into_stream();
    list.map(|secret| -> gax::Result<()> {
        println!("  secret={}", secret?.name);
        Ok(())
    })
    .fold(Ok(()), async |acc, result| -> gax::Result<()> {
        acc.and(result)
    })
    .await?;

Demikian pula, Anda dapat menggunakan fungsi into_stream untuk mengonversi Paginator menjadi futures::Stream.

let list = client
    .list_secrets()
    .set_parent(format!("projects/{project_id}"))
    .by_page()
    .into_stream();
list.enumerate()
    .map(|(index, page)| -> gax::Result<()> {
        println!(