Fix dropshot-pagination `_stream` client codegen (#756)

This commit is contained in:
John Gallagher 2024-04-03 12:42:05 -04:00 committed by GitHub
parent 9843d26122
commit 1a61bf1e66
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 1035 additions and 1167 deletions

8
Cargo.lock generated
View File

@ -1439,6 +1439,7 @@ version = "0.6.0"
dependencies = [
"dropshot",
"expectorate",
"futures",
"getopts",
"heck 0.4.1",
"http 0.2.9",
@ -1446,8 +1447,10 @@ dependencies = [
"indexmap",
"openapiv3",
"proc-macro2",
"progenitor-client",
"quote",
"regex",
"reqwest",
"rustfmt-wrapper",
"schemars",
"serde",
@ -1455,6 +1458,7 @@ dependencies = [
"serde_yaml",
"syn 2.0.52",
"thiserror",
"tokio",
"typify",
"unicode-ident",
]
@ -2230,9 +2234,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
[[package]]
name = "tokio"
version = "1.36.0"
version = "1.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
dependencies = [
"backtrace",
"bytes",

View File

@ -29,8 +29,13 @@ unicode-ident = "1.0.12"
[dev-dependencies]
dropshot = { git = "https://github.com/oxidecomputer/dropshot", default-features = false }
expectorate = "1.1"
futures = "0.3.30"
http = "0.2.9"
hyper = "0.14.27"
reqwest = "0.11.27"
rustfmt-wrapper = "0.2.1"
serde_yaml = "0.9"
serde_json = "1.0.113"
tokio = { version = "1.37.0", features = ["rt", "net"] }
progenitor-client.path = "../progenitor-client"

View File

@ -710,9 +710,12 @@ impl Generator {
let step_params = method.params.iter().map(|param| {
if param.api_name.as_str() == "page_token" {
quote! { state.as_deref() }
} else if let OperationParameterKind::Query(_) = param.kind {
// Query parameters are None; having page_token as Some(_)
// is mutually exclusive with other query parameters.
} else if param.api_name.as_str() != "limit"
&& matches!(param.kind, OperationParameterKind::Query(_))
{
// Query parameters (other than "page_token" and "limit")
// are None; having page_token as Some(_) is mutually
// exclusive with other query parameters.
quote! { None }
} else {
// Non-query parameters are passed in; this is necessary
@ -744,15 +747,6 @@ impl Generator {
use futures::TryFutureExt;
use futures::TryStreamExt;
// Grab the limit. This is intended to be agnostic to the
// specific type for the limit input which is why it's a
// bit convoluted.
let final_stream_limit = limit
.clone()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
// Execute the operation with the basic parameters
// (omitting page_token) to get the first page.
self.#operation_id( #(#first_params,)* )
@ -800,7 +794,6 @@ impl Generator {
first.chain(rest)
})
.try_flatten_stream()
.take(final_stream_limit)
.boxed()
}
}
@ -1767,7 +1760,12 @@ impl Generator {
self.uses_futures = true;
let step_params = method.params.iter().filter_map(|param| {
if let OperationParameterKind::Query(_) = param.kind {
if param.api_name.as_str() != "limit"
&& matches!(param.kind, OperationParameterKind::Query(_))
{
// Query parameters (other than "limit") are None; having
// page_token as Some(_), as we will during the loop below,
// is mutually exclusive with other query parameters.
let name = format_ident!("{}", param.name);
Some(quote! {
#name: Ok(None)
@ -1799,18 +1797,6 @@ impl Generator {
use futures::TryFutureExt;
use futures::TryStreamExt;
// Grab the limit. This is intended to be agnostic to the
// specific type for the limit input which is why it's a
// bit convoluted.
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
// This is the builder template we'll use for iterative
// steps past the first; it has all query params set to
// None (the step will fill in page_token).
@ -1865,7 +1851,6 @@ impl Generator {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}

View File

@ -29638,16 +29638,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -29682,7 +29673,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -30159,16 +30149,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -30203,7 +30184,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -30787,16 +30767,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -30831,7 +30802,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -31335,16 +31305,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -31379,7 +31340,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -31875,17 +31835,8 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
end_time: Ok(None),
limit: Ok(None),
page_token: Ok(None),
start_time: Ok(None),
..self.clone()
@ -31920,7 +31871,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -32069,16 +32019,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -32113,7 +32054,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -32560,16 +32500,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -32604,7 +32535,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -33067,16 +32997,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -33111,7 +33032,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -33741,16 +33661,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -33785,7 +33696,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -35156,16 +35066,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -35200,7 +35101,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -35646,16 +35546,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -35690,7 +35581,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -36502,16 +36392,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -36546,7 +36427,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -37206,16 +37086,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -37250,7 +37121,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -37967,16 +37837,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -38011,7 +37872,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -38672,16 +38532,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -38716,7 +38567,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -38926,16 +38776,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
..self.clone()
};
@ -38969,7 +38810,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -39184,16 +39024,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -39228,7 +39059,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -39342,16 +39172,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -39386,7 +39207,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -39875,16 +39695,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -39919,7 +39730,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40230,16 +40040,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40274,7 +40075,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40388,16 +40188,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40432,7 +40223,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40606,16 +40396,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40650,7 +40431,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40842,16 +40622,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40886,7 +40657,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -41000,16 +40770,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -41044,7 +40805,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -41349,16 +41109,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -41393,7 +41144,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -41786,16 +41536,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
..self.clone()
};
@ -41829,7 +41570,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -42123,16 +41863,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
..self.clone()
};
@ -42166,7 +41897,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -42662,16 +42392,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -42706,7 +42427,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -42880,16 +42600,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -42924,7 +42635,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -43248,16 +42958,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -43292,7 +42993,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44024,16 +43724,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -44068,7 +43759,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44261,16 +43951,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -44305,7 +43986,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44462,16 +44142,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
..self.clone()
};
@ -44505,7 +44176,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44619,16 +44289,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -44663,7 +44324,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44813,16 +44473,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
organization: Ok(None),
page_token: Ok(None),
project: Ok(None),
@ -44859,7 +44510,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -45318,16 +44968,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
organization: Ok(None),
page_token: Ok(None),
project: Ok(None),
@ -45364,7 +45005,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -45841,16 +45481,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
organization: Ok(None),
page_token: Ok(None),
project: Ok(None),
@ -45887,7 +45518,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -46950,16 +46580,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -46994,7 +46615,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -47576,16 +47196,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
organization: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
@ -47621,7 +47232,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -48301,16 +47911,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -48345,7 +47946,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -48460,16 +48060,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -48504,7 +48095,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -48835,16 +48425,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -48879,7 +48460,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}

View File

@ -29558,16 +29558,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -29602,7 +29593,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -30079,16 +30069,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -30123,7 +30104,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -30707,16 +30687,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -30751,7 +30722,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -31255,16 +31225,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -31299,7 +31260,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -31795,17 +31755,8 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
end_time: Ok(None),
limit: Ok(None),
page_token: Ok(None),
start_time: Ok(None),
..self.clone()
@ -31840,7 +31791,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -31989,16 +31939,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -32033,7 +31974,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -32480,16 +32420,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -32524,7 +32455,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -32987,16 +32917,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -33031,7 +32952,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -33661,16 +33581,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -33705,7 +33616,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -35076,16 +34986,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -35120,7 +35021,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -35566,16 +35466,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -35610,7 +35501,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -36422,16 +36312,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -36466,7 +36347,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -37126,16 +37006,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -37170,7 +37041,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -37887,16 +37757,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -37931,7 +37792,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -38592,16 +38452,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -38636,7 +38487,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -38846,16 +38696,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
..self.clone()
};
@ -38889,7 +38730,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -39104,16 +38944,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -39148,7 +38979,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -39262,16 +39092,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -39306,7 +39127,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -39795,16 +39615,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -39839,7 +39650,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40150,16 +39960,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40194,7 +39995,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40308,16 +40108,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40352,7 +40143,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40526,16 +40316,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40570,7 +40351,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40762,16 +40542,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40806,7 +40577,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -40920,16 +40690,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -40964,7 +40725,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -41269,16 +41029,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -41313,7 +41064,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -41706,16 +41456,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
..self.clone()
};
@ -41749,7 +41490,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -42043,16 +41783,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
..self.clone()
};
@ -42086,7 +41817,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -42582,16 +42312,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -42626,7 +42347,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -42800,16 +42520,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -42844,7 +42555,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -43168,16 +42878,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -43212,7 +42913,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -43944,16 +43644,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -43988,7 +43679,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44181,16 +43871,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -44225,7 +43906,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44382,16 +44062,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
..self.clone()
};
@ -44425,7 +44096,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44539,16 +44209,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -44583,7 +44244,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -44733,16 +44393,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
organization: Ok(None),
page_token: Ok(None),
project: Ok(None),
@ -44779,7 +44430,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -45238,16 +44888,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
organization: Ok(None),
page_token: Ok(None),
project: Ok(None),
@ -45284,7 +44925,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -45761,16 +45401,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
organization: Ok(None),
page_token: Ok(None),
project: Ok(None),
@ -45807,7 +45438,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -46870,16 +46500,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -46914,7 +46535,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -47496,16 +47116,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
organization: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
@ -47541,7 +47152,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -48221,16 +47831,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -48265,7 +47866,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -48380,16 +47980,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -48424,7 +48015,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}
@ -48755,16 +48345,7 @@ pub mod builder {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let limit = self
.limit
.clone()
.ok()
.flatten()
.and_then(|x| std::num::NonZeroUsize::try_from(x).ok())
.map(std::num::NonZeroUsize::get)
.unwrap_or(usize::MAX);
let next = Self {
limit: Ok(None),
page_token: Ok(None),
sort_by: Ok(None),
..self.clone()
@ -48799,7 +48380,6 @@ pub mod builder {
first.chain(rest)
})
.try_flatten_stream()
.take(limit)
.boxed()
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,494 @@
#[allow(unused_imports)]
use progenitor_client::{encode_path, RequestBuilderExt};
#[allow(unused_imports)]
pub use progenitor_client::{ByteStream, Error, ResponseValue};
#[allow(unused_imports)]
use reqwest::header::{HeaderMap, HeaderValue};
/// Types used as operation parameters and responses.
#[allow(clippy::all)]
pub mod types {
use serde::{Deserialize, Serialize};
#[allow(unused_imports)]
use std::convert::TryFrom;
/// Error types.
pub mod error {
/// Error from a TryFrom or FromStr implementation.
pub struct ConversionError(std::borrow::Cow<'static, str>);
impl std::error::Error for ConversionError {}
impl std::fmt::Display for ConversionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
std::fmt::Display::fmt(&self.0, f)
}
}
impl std::fmt::Debug for ConversionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
std::fmt::Debug::fmt(&self.0, f)
}
}
impl From<&'static str> for ConversionError {
fn from(value: &'static str) -> Self {
Self(value.into())
}
}
impl From<String> for ConversionError {
fn from(value: String) -> Self {
Self(value.into())
}
}
}
///Error information from a response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "Error information from a response.",
/// "type": "object",
/// "required": [
/// "message",
/// "request_id"
/// ],
/// "properties": {
/// "error_code": {
/// "type": "string"
/// },
/// "message": {
/// "type": "string"
/// },
/// "request_id": {
/// "type": "string"
/// }
/// }
///}
/// ```
/// </details>
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Error {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_code: Option<String>,
pub message: String,
pub request_id: String,
}
impl From<&Error> for Error {
fn from(value: &Error) -> Self {
value.clone()
}
}
impl Error {
pub fn builder() -> builder::Error {
Default::default()
}
}
///A single page of results
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "A single page of results",
/// "type": "object",
/// "required": [
/// "items"
/// ],
/// "properties": {
/// "items": {
/// "description": "list of items on this page of results",
/// "type": "array",
/// "items": {
/// "type": "integer",
/// "format": "uint32",
/// "minimum": 0.0
/// }
/// },
/// "next_page": {
/// "description": "token used to fetch the next page of results (if
/// any)",
/// "type": [
/// "string",
/// "null"
/// ]
/// }
/// }
///}
/// ```
/// </details>
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Uint32ResultsPage {
///list of items on this page of results
pub items: Vec<u32>,
///token used to fetch the next page of results (if any)
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_page: Option<String>,
}
impl From<&Uint32ResultsPage> for Uint32ResultsPage {
fn from(value: &Uint32ResultsPage) -> Self {
value.clone()
}
}
impl Uint32ResultsPage {
pub fn builder() -> builder::Uint32ResultsPage {
Default::default()
}
}
/// Types for composing complex structures.
pub mod builder {
#[derive(Clone, Debug)]
pub struct Error {
error_code: Result<Option<String>, String>,
message: Result<String, String>,
request_id: Result<String, String>,
}
impl Default for Error {
fn default() -> Self {
Self {
error_code: Ok(Default::default()),
message: Err("no value supplied for message".to_string()),
request_id: Err("no value supplied for request_id".to_string()),
}
}
}
impl Error {
pub fn error_code<T>(mut self, value: T) -> Self
where
T: std::convert::TryInto<Option<String>>,
T::Error: std::fmt::Display,
{
self.error_code = value
.try_into()
.map_err(|e| format!("error converting supplied value for error_code: {}", e));
self
}
pub fn message<T>(mut self, value: T) -> Self
where
T: std::convert::TryInto<String>,
T::Error: std::fmt::Display,
{
self.message = value
.try_into()
.map_err(|e| format!("error converting supplied value for message: {}", e));
self
}
pub fn request_id<T>(mut self, value: T) -> Self
where
T: std::convert::TryInto<String>,
T::Error: std::fmt::Display,
{
self.request_id = value
.try_into()
.map_err(|e| format!("error converting supplied value for request_id: {}", e));
self
}
}
impl std::convert::TryFrom<Error> for super::Error {
type Error = super::error::ConversionError;
fn try_from(value: Error) -> Result<Self, super::error::ConversionError> {
Ok(Self {
error_code: value.error_code?,
message: value.message?,
request_id: value.request_id?,
})
}
}
impl From<super::Error> for Error {
fn from(value: super::Error) -> Self {
Self {
error_code: Ok(value.error_code),
message: Ok(value.message),
request_id: Ok(value.request_id),
}
}
}
#[derive(Clone, Debug)]
pub struct Uint32ResultsPage {
items: Result<Vec<u32>, String>,
next_page: Result<Option<String>, String>,
}
impl Default for Uint32ResultsPage {
fn default() -> Self {
Self {
items: Err("no value supplied for items".to_string()),
next_page: Ok(Default::default()),
}
}
}
impl Uint32ResultsPage {
pub fn items<T>(mut self, value: T) -> Self
where
T: std::convert::TryInto<Vec<u32>>,
T::Error: std::fmt::Display,
{
self.items = value
.try_into()
.map_err(|e| format!("error converting supplied value for items: {}", e));
self
}
pub fn next_page<T>(mut self, value: T) -> Self
where
T: std::convert::TryInto<Option<String>>,
T::Error: std::fmt::Display,
{
self.next_page = value
.try_into()
.map_err(|e| format!("error converting supplied value for next_page: {}", e));
self
}
}
impl std::convert::TryFrom<Uint32ResultsPage> for super::Uint32ResultsPage {
type Error = super::error::ConversionError;
fn try_from(value: Uint32ResultsPage) -> Result<Self, super::error::ConversionError> {
Ok(Self {
items: value.items?,
next_page: value.next_page?,
})
}
}
impl From<super::Uint32ResultsPage> for Uint32ResultsPage {
fn from(value: super::Uint32ResultsPage) -> Self {
Self {
items: Ok(value.items),
next_page: Ok(value.next_page),
}
}
}
}
}
#[derive(Clone, Debug)]
///Client for test_stream_pagination
///
///Version: 1
pub struct Client {
pub(crate) baseurl: String,
pub(crate) client: reqwest::Client,
}
impl Client {
/// Create a new client.
///
/// `baseurl` is the base URL provided to the internal
/// `reqwest::Client`, and should include a scheme and hostname,
/// as well as port and a path stem if applicable.
pub fn new(baseurl: &str) -> Self {
#[cfg(not(target_arch = "wasm32"))]
let client = {
let dur = std::time::Duration::from_secs(15);
reqwest::ClientBuilder::new()
.connect_timeout(dur)
.timeout(dur)
};
#[cfg(target_arch = "wasm32")]
let client = reqwest::ClientBuilder::new();
Self::new_with_client(baseurl, client.build().unwrap())
}
/// Construct a new client with an existing `reqwest::Client`,
/// allowing more control over its configuration.
///
/// `baseurl` is the base URL provided to the internal
/// `reqwest::Client`, and should include a scheme and hostname,
/// as well as port and a path stem if applicable.
pub fn new_with_client(baseurl: &str, client: reqwest::Client) -> Self {
Self {
baseurl: baseurl.to_string(),
client,
}
}
/// Get the base URL to which requests are made.
pub fn baseurl(&self) -> &String {
&self.baseurl
}
/// Get the internal `reqwest::Client` used to make requests.
pub fn client(&self) -> &reqwest::Client {
&self.client
}
/// Get the version of this API.
///
/// This string is pulled directly from the source OpenAPI
/// document and may be in any format the API selects.
pub fn api_version(&self) -> &'static str {
"1"
}
}
impl Client {
///Sends a `GET` request to `/`
///
///Arguments:
/// - `limit`: Maximum number of items returned by a single call
/// - `page_token`: Token returned by previous call to retrieve the
/// subsequent page
///```ignore
/// let response = client.paginated_u32s()
/// .limit(limit)
/// .page_token(page_token)
/// .send()
/// .await;
/// ```
pub fn paginated_u32s(&self) -> builder::PaginatedU32s {
builder::PaginatedU32s::new(self)
}
}
/// Types for composing operation parameters.
#[allow(clippy::all)]
pub mod builder {
use super::types;
#[allow(unused_imports)]
use super::{
encode_path, ByteStream, Error, HeaderMap, HeaderValue, RequestBuilderExt, ResponseValue,
};
///Builder for [`Client::paginated_u32s`]
///
///[`Client::paginated_u32s`]: super::Client::paginated_u32s
#[derive(Debug, Clone)]
pub struct PaginatedU32s<'a> {
client: &'a super::Client,
limit: Result<Option<std::num::NonZeroU32>, String>,
page_token: Result<Option<String>, String>,
}
impl<'a> PaginatedU32s<'a> {
pub fn new(client: &'a super::Client) -> Self {
Self {
client: client,
limit: Ok(None),
page_token: Ok(None),
}
}
pub fn limit<V>(mut self, value: V) -> Self
where
V: std::convert::TryInto<std::num::NonZeroU32>,
{
self.limit = value.try_into().map(Some).map_err(|_| {
"conversion to `std :: num :: NonZeroU32` for limit failed".to_string()
});
self
}
pub fn page_token<V>(mut self, value: V) -> Self
where
V: std::convert::TryInto<String>,
{
self.page_token = value
.try_into()
.map(Some)
.map_err(|_| "conversion to `String` for page_token failed".to_string());
self
}
///Sends a `GET` request to `/`
pub async fn send(
self,
) -> Result<ResponseValue<types::Uint32ResultsPage>, Error<types::Error>> {
let Self {
client,
limit,
page_token,
} = self;
let limit = limit.map_err(Error::InvalidRequest)?;
let page_token = page_token.map_err(Error::InvalidRequest)?;
let url = format!("{}/", client.baseurl,);
let mut query = Vec::with_capacity(2usize);
if let Some(v) = &limit {
query.push(("limit", v.to_string()));
}
if let Some(v) = &page_token {
query.push(("page_token", v.to_string()));
}
#[allow(unused_mut)]
let mut request = client
.client
.get(url)
.header(
reqwest::header::ACCEPT,
reqwest::header::HeaderValue::from_static("application/json"),
)
.query(&query)
.build()?;
let result = client.client.execute(request).await;
let response = result?;
match response.status().as_u16() {
200u16 => ResponseValue::from_response(response).await,
400u16..=499u16 => Err(Error::ErrorResponse(
ResponseValue::from_response(response).await?,
)),
500u16..=599u16 => Err(Error::ErrorResponse(
ResponseValue::from_response(response).await?,
)),
_ => Err(Error::UnexpectedResponse(response)),
}
}
///Streams `GET` requests to `/`
pub fn stream(
self,
) -> impl futures::Stream<Item = Result<u32, Error<types::Error>>> + Unpin + 'a {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
let next = Self {
page_token: Ok(None),
..self.clone()
};
self.send()
.map_ok(move |page| {
let page = page.into_inner();
let first = futures::stream::iter(page.items).map(Ok);
let rest = futures::stream::try_unfold(
(page.next_page, next),
|(next_page, next)| async {
if next_page.is_none() {
Ok(None)
} else {
Self {
page_token: Ok(next_page),
..next.clone()
}
.send()
.map_ok(|page| {
let page = page.into_inner();
Some((
futures::stream::iter(page.items).map(Ok),
(page.next_page, next),
))
})
.await
}
},
)
.try_flatten();
first.chain(rest)
})
.try_flatten_stream()
.boxed()
}
}
}
/// Items consumers will typically use such as the Client.
pub mod prelude {
pub use self::super::Client;
}

View File

@ -0,0 +1,278 @@
#[allow(unused_imports)]
use progenitor_client::{encode_path, RequestBuilderExt};
#[allow(unused_imports)]
pub use progenitor_client::{ByteStream, Error, ResponseValue};
#[allow(unused_imports)]
use reqwest::header::{HeaderMap, HeaderValue};
/// Types used as operation parameters and responses.
#[allow(clippy::all)]
pub mod types {
use serde::{Deserialize, Serialize};
#[allow(unused_imports)]
use std::convert::TryFrom;
/// Error types.
pub mod error {
/// Error from a TryFrom or FromStr implementation.
pub struct ConversionError(std::borrow::Cow<'static, str>);
impl std::error::Error for ConversionError {}
impl std::fmt::Display for ConversionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
std::fmt::Display::fmt(&self.0, f)
}
}
impl std::fmt::Debug for ConversionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
std::fmt::Debug::fmt(&self.0, f)
}
}
impl From<&'static str> for ConversionError {
fn from(value: &'static str) -> Self {
Self(value.into())
}
}
impl From<String> for ConversionError {
fn from(value: String) -> Self {
Self(value.into())
}
}
}
///Error information from a response.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "Error information from a response.",
/// "type": "object",
/// "required": [
/// "message",
/// "request_id"
/// ],
/// "properties": {
/// "error_code": {
/// "type": "string"
/// },
/// "message": {
/// "type": "string"
/// },
/// "request_id": {
/// "type": "string"
/// }
/// }
///}
/// ```
/// </details>
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Error {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error_code: Option<String>,
pub message: String,
pub request_id: String,
}
impl From<&Error> for Error {
fn from(value: &Error) -> Self {
value.clone()
}
}
///A single page of results
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "A single page of results",
/// "type": "object",
/// "required": [
/// "items"
/// ],
/// "properties": {
/// "items": {
/// "description": "list of items on this page of results",
/// "type": "array",
/// "items": {
/// "type": "integer",
/// "format": "uint32",
/// "minimum": 0.0
/// }
/// },
/// "next_page": {
/// "description": "token used to fetch the next page of results (if
/// any)",
/// "type": [
/// "string",
/// "null"
/// ]
/// }
/// }
///}
/// ```
/// </details>
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Uint32ResultsPage {
///list of items on this page of results
pub items: Vec<u32>,
///token used to fetch the next page of results (if any)
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_page: Option<String>,
}
impl From<&Uint32ResultsPage> for Uint32ResultsPage {
fn from(value: &Uint32ResultsPage) -> Self {
value.clone()
}
}
}
#[derive(Clone, Debug)]
///Client for test_stream_pagination
///
///Version: 1
pub struct Client {
pub(crate) baseurl: String,
pub(crate) client: reqwest::Client,
}
impl Client {
/// Create a new client.
///
/// `baseurl` is the base URL provided to the internal
/// `reqwest::Client`, and should include a scheme and hostname,
/// as well as port and a path stem if applicable.
pub fn new(baseurl: &str) -> Self {
#[cfg(not(target_arch = "wasm32"))]
let client = {
let dur = std::time::Duration::from_secs(15);
reqwest::ClientBuilder::new()
.connect_timeout(dur)
.timeout(dur)
};
#[cfg(target_arch = "wasm32")]
let client = reqwest::ClientBuilder::new();
Self::new_with_client(baseurl, client.build().unwrap())
}
/// Construct a new client with an existing `reqwest::Client`,
/// allowing more control over its configuration.
///
/// `baseurl` is the base URL provided to the internal
/// `reqwest::Client`, and should include a scheme and hostname,
/// as well as port and a path stem if applicable.
pub fn new_with_client(baseurl: &str, client: reqwest::Client) -> Self {
Self {
baseurl: baseurl.to_string(),
client,
}
}
/// Get the base URL to which requests are made.
pub fn baseurl(&self) -> &String {
&self.baseurl
}
/// Get the internal `reqwest::Client` used to make requests.
pub fn client(&self) -> &reqwest::Client {
&self.client
}
/// Get the version of this API.
///
/// This string is pulled directly from the source OpenAPI
/// document and may be in any format the API selects.
pub fn api_version(&self) -> &'static str {
"1"
}
}
#[allow(clippy::all)]
impl Client {
///Sends a `GET` request to `/`
///
///Arguments:
/// - `limit`: Maximum number of items returned by a single call
/// - `page_token`: Token returned by previous call to retrieve the
/// subsequent page
pub async fn paginated_u32s<'a>(
&'a self,
limit: Option<std::num::NonZeroU32>,
page_token: Option<&'a str>,
) -> Result<ResponseValue<types::Uint32ResultsPage>, Error<types::Error>> {
let url = format!("{}/", self.baseurl,);
let mut query = Vec::with_capacity(2usize);
if let Some(v) = &limit {
query.push(("limit", v.to_string()));
}
if let Some(v) = &page_token {
query.push(("page_token", v.to_string()));
}
#[allow(unused_mut)]
let mut request = self
.client
.get(url)
.header(
reqwest::header::ACCEPT,
reqwest::header::HeaderValue::from_static("application/json"),
)
.query(&query)
.build()?;
let result = self.client.execute(request).await;
let response = result?;
match response.status().as_u16() {
200u16 => ResponseValue::from_response(response).await,
400u16..=499u16 => Err(Error::ErrorResponse(
ResponseValue::from_response(response).await?,
)),
500u16..=599u16 => Err(Error::ErrorResponse(
ResponseValue::from_response(response).await?,
)),
_ => Err(Error::UnexpectedResponse(response)),
}
}
///Sends repeated `GET` requests to `/` until there are no more results.
///
///Arguments:
/// - `limit`: Maximum number of items returned by a single call
pub fn paginated_u32s_stream<'a>(
&'a self,
limit: Option<std::num::NonZeroU32>,
) -> impl futures::Stream<Item = Result<u32, Error<types::Error>>> + Unpin + '_ {
use futures::StreamExt;
use futures::TryFutureExt;
use futures::TryStreamExt;
self.paginated_u32s(limit, None)
.map_ok(move |page| {
let page = page.into_inner();
let first = futures::stream::iter(page.items).map(Ok);
let rest = futures::stream::try_unfold(page.next_page, move |state| async move {
if state.is_none() {
Ok(None)
} else {
self.paginated_u32s(limit, state.as_deref())
.map_ok(|page| {
let page = page.into_inner();
Some((futures::stream::iter(page.items).map(Ok), page.next_page))
})
.await
}
})
.try_flatten();
first.chain(rest)
})
.try_flatten_stream()
.boxed()
}
}
/// Items consumers will typically use such as the Client.
pub mod prelude {
#[allow(unused_imports)]
pub use super::Client;
}

View File

@ -1,11 +1,12 @@
// Copyright 2023 Oxide Computer Company
use std::str::from_utf8;
use dropshot::{
endpoint, ApiDescription, HttpError, HttpResponseUpdatedNoContent, Path,
Query, RequestContext, TypedBody,
endpoint, ApiDescription, ConfigDropshot, ConfigLogging,
ConfigLoggingLevel, EmptyScanParams, HttpError, HttpResponseOk,
HttpResponseUpdatedNoContent, HttpServerStarter, PaginationParams, Path,
Query, RequestContext, ResultsPage, TypedBody,
};
use futures::StreamExt;
use http::Response;
use hyper::Body;
use openapiv3::OpenAPI;
@ -14,6 +15,11 @@ use progenitor_impl::{
};
use schemars::JsonSchema;
use serde::Deserialize;
use std::{
net::{Ipv4Addr, SocketAddr},
str::from_utf8,
sync::{Arc, Mutex},
};
fn generate_formatted(generator: &mut Generator, spec: &OpenAPI) -> String {
let content = generator.generate_tokens(&spec).unwrap();
@ -182,3 +188,191 @@ fn test_default_params() {
&output,
);
}
#[derive(Debug)]
struct PaginatedU32sContext {
all_values: std::ops::Range<u32>,
// Record of `(offset, limit)` pairs we received
page_pairs: Mutex<Vec<(usize, usize)>>,
}
#[endpoint {
method = GET,
path = "/",
}]
async fn paginated_u32s(
rqctx: RequestContext<Arc<PaginatedU32sContext>>,
query_params: Query<PaginationParams<EmptyScanParams, u32>>,
) -> Result<HttpResponseOk<ResultsPage<u32>>, HttpError> {
let ctx = rqctx.context();
let page_params = query_params.into_inner();
let limit = usize::try_from(
rqctx
.page_limit(&page_params)
.expect("invalid page limit")
.get(),
)
.expect("non-usize limit");
let offset = match page_params.page {
dropshot::WhichPage::First(EmptyScanParams {}) => 0,
dropshot::WhichPage::Next(offset) => {
usize::try_from(offset + 1).expect("non-usize offset")
}
};
ctx.page_pairs.lock().unwrap().push((offset, limit));
let values = ctx.all_values.clone().skip(offset).take(limit).collect();
let result =
ResultsPage::new(values, &(), |&x, &()| x).expect("bad results page");
Ok(HttpResponseOk(result))
}
#[tokio::test]
async fn test_stream_pagination() {
const TEST_NAME: &str = "test_stream_pagination";
let mut api = ApiDescription::new();
api.register(paginated_u32s).unwrap();
let mut out = Vec::new();
api.openapi(TEST_NAME, "1").write(&mut out).unwrap();
let out = from_utf8(&out).unwrap();
let spec = serde_json::from_str::<OpenAPI>(out).unwrap();
// Test both interface styles.
let mut generator = Generator::new(
GenerationSettings::new().with_interface(InterfaceStyle::Positional),
);
let output = generate_formatted(&mut generator, &spec);
expectorate::assert_contents(
format!("tests/output/src/{TEST_NAME}_positional.rs"),
&output,
);
let mut generator = Generator::new(
GenerationSettings::new().with_interface(InterfaceStyle::Builder),
);
let output = generate_formatted(&mut generator, &spec);
expectorate::assert_contents(
format!("tests/output/src/{TEST_NAME}_builder.rs"),
&output,
);
// Run the Dropshot server.
let config_dropshot = ConfigDropshot {
bind_address: SocketAddr::from((Ipv4Addr::LOCALHOST, 0)),
..Default::default()
};
let config_logging = ConfigLogging::StderrTerminal {
level: ConfigLoggingLevel::Debug,
};
let log = config_logging
.to_logger(TEST_NAME)
.expect("failed to create logger");
let server_ctx = Arc::new(PaginatedU32sContext {
all_values: 0..35,
page_pairs: Mutex::default(),
});
let server = HttpServerStarter::new(
&config_dropshot,
api,
Arc::clone(&server_ctx),
&log,
)
.expect("failed to create server")
.start();
let server_addr = format!("http://{}", server.local_addr());
// Test the positional client.
#[allow(dead_code)]
mod gen_client_positional {
// This is weird: we're now `include!`ing the file we just used to
// confirm the generated code is what we expect. If changes are made to
// progenitor that affect this generated code, keep in mind that when
// this test executes, the above check is against what we _currently_
// produce, while this `include!` is what was on disk before the test
// ran. This can be surprising if you're running the test with
// `EXPECTORATE=overwrite`, because the above check will overwrite the
// file on disk, but then the test proceeds and gets to this point,
// where it uses what was on disk _before_ expectorate overwrote it.
include!("output/src/test_stream_pagination_positional.rs");
}
let client = gen_client_positional::Client::new(&server_addr);
let page_limit = 10.try_into().unwrap();
let mut stream = client.paginated_u32s_stream(Some(page_limit));
let mut all_values = Vec::new();
while let Some(result) = stream.next().await {
match result {
Ok(value) => {
all_values.push(value);
}
Err(err) => {
panic!("unexpected error: {err}");
}
}
}
// Ensure we got all the results we expected.
let expected_values = (0..35).collect::<Vec<_>>();
assert_eq!(expected_values, all_values);
// Ensure the server saw the page requests we expect: we should always see a
// limit of 10, and we should see offsets increasing by 10 until we get to
// (30, 10); that will return 5 items, so we should see one final (35, 10)
// for the client to confirm there are no more results.
let expected_pages = vec![(0, 10), (10, 10), (20, 10), (30, 10), (35, 10)];
assert_eq!(expected_pages, *server_ctx.page_pairs.lock().unwrap());
// Repeat the test with the builder client.
server_ctx.page_pairs.lock().unwrap().clear();
#[allow(dead_code, unused_imports)]
mod gen_client_builder {
// This is weird: we're now `include!`ing the file we just used to
// confirm the generated code is what we expect. If changes are made to
// progenitor that affect this generated code, keep in mind that when
// this test executes, the above check is against what we _currently_
// produce, while this `include!` is what was on disk before the test
// ran. This can be surprising if you're running the test with
// `EXPECTORATE=overwrite`, because the above check will overwrite the
// file on disk, but then the test proceeds and gets to this point,
// where it uses what was on disk _before_ expectorate overwrote it.
include!("output/src/test_stream_pagination_builder.rs");
}
let client = gen_client_builder::Client::new(&server_addr);
let mut stream = client.paginated_u32s().limit(page_limit).stream();
let mut all_values = Vec::new();
while let Some(result) = stream.next().await {
match result {
Ok(value) => {
all_values.push(value);
}
Err(err) => {
panic!("unexpected error: {err}");
}
}
}
// Ensure we got all the results we expected.
let expected_values = (0..35).collect::<Vec<_>>();
assert_eq!(expected_values, all_values);
// Ensure the server saw the page requests we expect: we should always see a
// limit of 10, and we should see offsets increasing by 10 until we get to
// (30, 10); that will return 5 items, so we should see one final (35, 10)
// for the client to confirm there are no more results.
let expected_pages = vec![(0, 10), (10, 10), (20, 10), (30, 10), (35, 10)];
assert_eq!(expected_pages, *server_ctx.page_pairs.lock().unwrap());
server.close().await.expect("failed to close server");
}