aws_sdk_s3/operation/list_buckets/paginator.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
/// Paginator for [`ListBuckets`](crate::operation::list_buckets::ListBuckets)
pub struct ListBucketsPaginator {
handle: std::sync::Arc<crate::client::Handle>,
builder: crate::operation::list_buckets::builders::ListBucketsInputBuilder,
stop_on_duplicate_token: bool,
}
impl ListBucketsPaginator {
/// Create a new paginator-wrapper
pub(crate) fn new(
handle: std::sync::Arc<crate::client::Handle>,
builder: crate::operation::list_buckets::builders::ListBucketsInputBuilder,
) -> Self {
Self {
handle,
builder,
stop_on_duplicate_token: true,
}
}
/// Set the page size
///
/// _Note: this method will override any previously set value for `max_buckets`_
pub fn page_size(mut self, limit: i32) -> Self {
self.builder.max_buckets = ::std::option::Option::Some(limit);
self
}
/// Create a flattened paginator
///
/// This paginator automatically flattens results using `buckets`. Queries to the underlying service
/// are dispatched lazily.
pub fn items(self) -> crate::operation::list_buckets::paginator::ListBucketsPaginatorItems {
crate::operation::list_buckets::paginator::ListBucketsPaginatorItems(self)
}
/// Stop paginating when the service returns the same pagination token twice in a row.
///
/// Defaults to true.
///
/// For certain operations, it may be useful to continue on duplicate token. For example,
/// if an operation is for tailing a log file in real-time, then continuing may be desired.
/// This option can be set to `false` to accommodate these use cases.
pub fn stop_on_duplicate_token(mut self, stop_on_duplicate_token: bool) -> Self {
self.stop_on_duplicate_token = stop_on_duplicate_token;
self
}
/// Create the pagination stream
///
/// _Note:_ No requests will be dispatched until the stream is used
/// (e.g. with the [`.next().await`](aws_smithy_async::future::pagination_stream::PaginationStream::next) method).
pub fn send(
self,
) -> ::aws_smithy_async::future::pagination_stream::PaginationStream<
::std::result::Result<
crate::operation::list_buckets::ListBucketsOutput,
::aws_smithy_runtime_api::client::result::SdkError<
crate::operation::list_buckets::ListBucketsError,
::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
>,
>,
> {
// Move individual fields out of self for the borrow checker
let builder = self.builder;
let handle = self.handle;
let runtime_plugins = crate::operation::list_buckets::ListBuckets::operation_runtime_plugins(
handle.runtime_plugins.clone(),
&handle.conf,
::std::option::Option::None,
)
.with_operation_plugin(crate::sdk_feature_tracker::paginator::PaginatorFeatureTrackerRuntimePlugin::new());
::aws_smithy_async::future::pagination_stream::PaginationStream::new(::aws_smithy_async::future::pagination_stream::fn_stream::FnStream::new(
move |tx| {
::std::boxed::Box::pin(async move {
// Build the input for the first time. If required fields are missing, this is where we'll produce an early error.
let mut input = match builder
.build()
.map_err(::aws_smithy_runtime_api::client::result::SdkError::construction_failure)
{
::std::result::Result::Ok(input) => input,
::std::result::Result::Err(e) => {
let _ = tx.send(::std::result::Result::Err(e)).await;
return;
}
};
loop {
let resp = crate::operation::list_buckets::ListBuckets::orchestrate(&runtime_plugins, input.clone()).await;
// If the input member is None or it was an error
let done = match resp {
::std::result::Result::Ok(ref resp) => {
let new_token = crate::lens::reflens_list_buckets_output_output_continuation_token(resp);
// Pagination is exhausted when the next token is an empty string
let is_empty = new_token.map(|token| token.is_empty()).unwrap_or(true);
if !is_empty && new_token == input.continuation_token.as_ref() && self.stop_on_duplicate_token {
true
} else {
input.continuation_token = new_token.cloned();
is_empty
}
}
::std::result::Result::Err(_) => true,
};
if tx.send(resp).await.is_err() {
// receiving end was dropped
return;
}
if done {
return;
}
}
})
},
))
}
}
/// Flattened paginator for `ListBucketsPaginator`
///
/// This is created with [`.items()`](ListBucketsPaginator::items)
pub struct ListBucketsPaginatorItems(ListBucketsPaginator);
impl ListBucketsPaginatorItems {
/// Create the pagination stream
///
/// _Note_: No requests will be dispatched until the stream is used
/// (e.g. with the [`.next().await`](aws_smithy_async::future::pagination_stream::PaginationStream::next) method).
///
/// To read the entirety of the paginator, use [`.collect::<Result<Vec<_>, _>()`](aws_smithy_async::future::pagination_stream::PaginationStream::collect).
pub fn send(
self,
) -> ::aws_smithy_async::future::pagination_stream::PaginationStream<
::std::result::Result<
crate::types::Bucket,
::aws_smithy_runtime_api::client::result::SdkError<
crate::operation::list_buckets::ListBucketsError,
::aws_smithy_runtime_api::client::orchestrator::HttpResponse,
>,
>,
> {
::aws_smithy_async::future::pagination_stream::TryFlatMap::new(self.0.send())
.flat_map(|page| crate::lens::lens_list_buckets_output_output_buckets(page).unwrap_or_default().into_iter())
}
}