diff --git a/Cargo.lock b/Cargo.lock index 77baedc..e30c6ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/progenitor-impl/Cargo.toml b/progenitor-impl/Cargo.toml index abbf9cf..aa05527 100644 --- a/progenitor-impl/Cargo.toml +++ b/progenitor-impl/Cargo.toml @@ -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" diff --git a/progenitor-impl/src/method.rs b/progenitor-impl/src/method.rs index fdf53a9..2c2a731 100644 --- a/progenitor-impl/src/method.rs +++ b/progenitor-impl/src/method.rs @@ -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() } } diff --git a/progenitor-impl/tests/output/src/nexus_builder.rs b/progenitor-impl/tests/output/src/nexus_builder.rs index df81a2d..4bdfe98 100644 --- a/progenitor-impl/tests/output/src/nexus_builder.rs +++ b/progenitor-impl/tests/output/src/nexus_builder.rs @@ -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() } } diff --git a/progenitor-impl/tests/output/src/nexus_builder_tagged.rs b/progenitor-impl/tests/output/src/nexus_builder_tagged.rs index a4016b6..9ba1bd5 100644 --- a/progenitor-impl/tests/output/src/nexus_builder_tagged.rs +++ b/progenitor-impl/tests/output/src/nexus_builder_tagged.rs @@ -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() } } diff --git a/progenitor-impl/tests/output/src/nexus_positional.rs b/progenitor-impl/tests/output/src/nexus_positional.rs index 6f19d35..31b9a41 100644 --- a/progenitor-impl/tests/output/src/nexus_positional.rs +++ b/progenitor-impl/tests/output/src/nexus_positional.rs @@ -13963,11 +13963,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.group_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -13976,7 +13971,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.group_list(None, state.as_deref(), None) + self.group_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -13988,7 +13983,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -14223,11 +14217,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.organization_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -14236,7 +14225,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.organization_list(None, state.as_deref(), None) + self.organization_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -14248,7 +14237,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -14574,11 +14562,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.project_list(organization_name, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -14587,7 +14570,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.project_list(organization_name, None, state.as_deref(), None) + self.project_list(organization_name, limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -14599,7 +14582,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -14869,11 +14851,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.disk_list(organization_name, project_name, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -14885,7 +14862,7 @@ impl Client { self.disk_list( organization_name, project_name, - None, + limit, state.as_deref(), None, ) @@ -14900,7 +14877,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -15137,11 +15113,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.disk_metrics_list( organization_name, project_name, @@ -15165,7 +15136,7 @@ impl Client { disk_name, metric_name, None, - None, + limit, state.as_deref(), None, ) @@ -15180,7 +15151,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -15274,11 +15244,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.image_list(organization_name, project_name, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -15290,7 +15255,7 @@ impl Client { self.image_list( organization_name, project_name, - None, + limit, state.as_deref(), None, ) @@ -15305,7 +15270,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -15529,11 +15493,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.instance_list(organization_name, project_name, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -15545,7 +15504,7 @@ impl Client { self.instance_list( organization_name, project_name, - None, + limit, state.as_deref(), None, ) @@ -15560,7 +15519,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -15789,11 +15747,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.instance_disk_list( organization_name, project_name, @@ -15813,7 +15766,7 @@ impl Client { organization_name, project_name, instance_name, - None, + limit, state.as_deref(), None, ) @@ -15828,7 +15781,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -16099,11 +16051,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.instance_network_interface_list( organization_name, project_name, @@ -16123,7 +16070,7 @@ impl Client { organization_name, project_name, instance_name, - None, + limit, state.as_deref(), None, ) @@ -16138,7 +16085,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -16744,11 +16690,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.snapshot_list(organization_name, project_name, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -16760,7 +16701,7 @@ impl Client { self.snapshot_list( organization_name, project_name, - None, + limit, state.as_deref(), None, ) @@ -16775,7 +16716,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -16992,11 +16932,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.vpc_list(organization_name, project_name, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -17008,7 +16943,7 @@ impl Client { self.vpc_list( organization_name, project_name, - None, + limit, state.as_deref(), None, ) @@ -17023,7 +16958,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -17372,11 +17306,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.vpc_router_list( organization_name, project_name, @@ -17396,7 +17325,7 @@ impl Client { organization_name, project_name, vpc_name, - None, + limit, state.as_deref(), None, ) @@ -17411,7 +17340,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -17690,11 +17618,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.vpc_router_route_list( organization_name, project_name, @@ -17716,7 +17639,7 @@ impl Client { project_name, vpc_name, router_name, - None, + limit, state.as_deref(), None, ) @@ -17731,7 +17654,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -18008,11 +17930,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.vpc_subnet_list( organization_name, project_name, @@ -18032,7 +17949,7 @@ impl Client { organization_name, project_name, vpc_name, - None, + limit, state.as_deref(), None, ) @@ -18047,7 +17964,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -18322,11 +18238,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.vpc_subnet_list_network_interfaces( organization_name, project_name, @@ -18348,7 +18259,7 @@ impl Client { project_name, vpc_name, subnet_name, - None, + limit, state.as_deref(), None, ) @@ -18363,7 +18274,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -18490,11 +18400,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.role_list(limit, None) .map_ok(move |page| { let page = page.into_inner(); @@ -18503,7 +18408,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.role_list(None, state.as_deref()) + self.role_list(limit, state.as_deref()) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -18515,7 +18420,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -18656,11 +18560,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.session_me_groups(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -18669,7 +18568,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.session_me_groups(None, state.as_deref(), None) + self.session_me_groups(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -18681,7 +18580,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -18758,11 +18656,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.session_sshkey_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -18771,7 +18664,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.session_sshkey_list(None, state.as_deref(), None) + self.session_sshkey_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -18783,7 +18676,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -19080,11 +18972,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.certificate_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -19093,7 +18980,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.certificate_list(None, state.as_deref(), None) + self.certificate_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -19105,7 +18992,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -19288,11 +19174,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.physical_disk_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -19301,7 +19182,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.physical_disk_list(None, state.as_deref(), None) + self.physical_disk_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -19313,7 +19194,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -19386,11 +19266,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.rack_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -19399,7 +19274,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.rack_list(None, state.as_deref(), None) + self.rack_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -19411,7 +19286,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -19522,11 +19396,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.sled_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -19535,7 +19404,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.sled_list(None, state.as_deref(), None) + self.sled_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -19547,7 +19416,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -19668,11 +19536,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.sled_physical_disk_list(sled_id, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -19681,7 +19544,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.sled_physical_disk_list(sled_id, None, state.as_deref(), None) + self.sled_physical_disk_list(sled_id, limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -19693,7 +19556,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -19775,11 +19637,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.system_image_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -19788,7 +19645,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.system_image_list(None, state.as_deref(), None) + self.system_image_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -19800,7 +19657,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -19984,11 +19840,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.ip_pool_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -19997,7 +19848,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.ip_pool_list(None, state.as_deref(), None) + self.ip_pool_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -20009,7 +19860,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -20226,11 +20076,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.ip_pool_range_list(pool_name, limit, None) .map_ok(move |page| { let page = page.into_inner(); @@ -20239,7 +20084,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.ip_pool_range_list(pool_name, None, state.as_deref()) + self.ip_pool_range_list(pool_name, limit, state.as_deref()) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -20251,7 +20096,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -20425,11 +20269,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.ip_pool_service_range_list(limit, None) .map_ok(move |page| { let page = page.into_inner(); @@ -20438,7 +20277,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.ip_pool_service_range_list(None, state.as_deref()) + self.ip_pool_service_range_list(limit, state.as_deref()) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -20450,7 +20289,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -20717,11 +20555,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.saga_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -20730,7 +20563,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.saga_list(None, state.as_deref(), None) + self.saga_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -20742,7 +20575,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -20854,11 +20686,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.silo_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -20867,7 +20694,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.silo_list(None, state.as_deref(), None) + self.silo_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -20879,7 +20706,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -21074,11 +20900,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.silo_identity_provider_list(silo_name, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -21087,7 +20908,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.silo_identity_provider_list(silo_name, None, state.as_deref(), None) + self.silo_identity_provider_list(silo_name, limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -21099,7 +20920,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -21480,11 +21300,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.silo_users_list(silo_name, limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -21493,7 +21308,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.silo_users_list(silo_name, None, state.as_deref(), None) + self.silo_users_list(silo_name, limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -21505,7 +21320,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -21620,11 +21434,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.system_user_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -21633,7 +21442,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.system_user_list(None, state.as_deref(), None) + self.system_user_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -21645,7 +21454,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -21749,11 +21557,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.timeseries_schema_get(limit, None) .map_ok(move |page| { let page = page.into_inner(); @@ -21762,7 +21565,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.timeseries_schema_get(None, state.as_deref()) + self.timeseries_schema_get(limit, state.as_deref()) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -21774,7 +21577,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -21847,11 +21649,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.user_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -21860,7 +21657,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.user_list(None, state.as_deref(), None) + self.user_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -21872,7 +21669,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -21961,11 +21757,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.disk_list_v1(limit, organization, None, project, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -21974,7 +21765,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.disk_list_v1(None, None, state.as_deref(), None, None) + self.disk_list_v1(limit, None, state.as_deref(), None, None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -21986,7 +21777,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -22211,11 +22001,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.instance_list_v1(limit, organization, None, project, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -22224,7 +22009,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.instance_list_v1(None, None, state.as_deref(), None, None) + self.instance_list_v1(limit, None, state.as_deref(), None, None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -22236,7 +22021,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -22468,11 +22252,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.instance_disk_list_v1(instance, limit, organization, None, project, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -22483,7 +22262,7 @@ impl Client { } else { self.instance_disk_list_v1( instance, - None, + limit, None, state.as_deref(), None, @@ -22500,7 +22279,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -22989,11 +22767,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.organization_list_v1(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -23002,7 +22775,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.organization_list_v1(None, state.as_deref(), None) + self.organization_list_v1(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -23014,7 +22787,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -23306,11 +23078,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.project_list_v1(limit, organization, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -23319,7 +23086,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.project_list_v1(None, None, state.as_deref(), None) + self.project_list_v1(limit, None, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -23331,7 +23098,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -23655,11 +23421,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.system_component_version_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -23668,7 +23429,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.system_component_version_list(None, state.as_deref(), None) + self.system_component_version_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -23680,7 +23441,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -23754,11 +23514,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.update_deployments_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -23767,7 +23522,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.update_deployments_list(None, state.as_deref(), None) + self.update_deployments_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -23779,7 +23534,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } @@ -23982,11 +23736,6 @@ impl Client { use futures::StreamExt; use futures::TryFutureExt; use futures::TryStreamExt; - 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); self.system_update_list(limit, None, sort_by) .map_ok(move |page| { let page = page.into_inner(); @@ -23995,7 +23744,7 @@ impl Client { if state.is_none() { Ok(None) } else { - self.system_update_list(None, state.as_deref(), None) + self.system_update_list(limit, state.as_deref(), None) .map_ok(|page| { let page = page.into_inner(); Some((futures::stream::iter(page.items).map(Ok), page.next_page)) @@ -24007,7 +23756,6 @@ impl Client { first.chain(rest) }) .try_flatten_stream() - .take(final_stream_limit) .boxed() } diff --git a/progenitor-impl/tests/output/src/test_stream_pagination_builder.rs b/progenitor-impl/tests/output/src/test_stream_pagination_builder.rs new file mode 100644 index 0000000..3d41c7c --- /dev/null +++ b/progenitor-impl/tests/output/src/test_stream_pagination_builder.rs @@ -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 for ConversionError { + fn from(value: String) -> Self { + Self(value.into()) + } + } + } + + ///Error information from a response. + /// + ///
JSON schema + /// + /// ```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" + /// } + /// } + ///} + /// ``` + ///
+ #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct Error { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub error_code: Option, + 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 + /// + ///
JSON schema + /// + /// ```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" + /// ] + /// } + /// } + ///} + /// ``` + ///
+ #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct Uint32ResultsPage { + ///list of items on this page of results + pub items: Vec, + ///token used to fetch the next page of results (if any) + #[serde(default, skip_serializing_if = "Option::is_none")] + pub next_page: Option, + } + + 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, String>, + message: Result, + request_id: Result, + } + + 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(mut self, value: T) -> Self + where + T: std::convert::TryInto>, + 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(mut self, value: T) -> Self + where + T: std::convert::TryInto, + 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(mut self, value: T) -> Self + where + T: std::convert::TryInto, + 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 for super::Error { + type Error = super::error::ConversionError; + fn try_from(value: Error) -> Result { + Ok(Self { + error_code: value.error_code?, + message: value.message?, + request_id: value.request_id?, + }) + } + } + + impl From 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, String>, + next_page: Result, 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(mut self, value: T) -> Self + where + T: std::convert::TryInto>, + 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(mut self, value: T) -> Self + where + T: std::convert::TryInto>, + 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 for super::Uint32ResultsPage { + type Error = super::error::ConversionError; + fn try_from(value: Uint32ResultsPage) -> Result { + Ok(Self { + items: value.items?, + next_page: value.next_page?, + }) + } + } + + impl From 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, String>, + page_token: Result, 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(mut self, value: V) -> Self + where + V: std::convert::TryInto, + { + self.limit = value.try_into().map(Some).map_err(|_| { + "conversion to `std :: num :: NonZeroU32` for limit failed".to_string() + }); + self + } + + pub fn page_token(mut self, value: V) -> Self + where + V: std::convert::TryInto, + { + 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, 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>> + 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; +} diff --git a/progenitor-impl/tests/output/src/test_stream_pagination_positional.rs b/progenitor-impl/tests/output/src/test_stream_pagination_positional.rs new file mode 100644 index 0000000..6cba250 --- /dev/null +++ b/progenitor-impl/tests/output/src/test_stream_pagination_positional.rs @@ -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 for ConversionError { + fn from(value: String) -> Self { + Self(value.into()) + } + } + } + + ///Error information from a response. + /// + ///
JSON schema + /// + /// ```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" + /// } + /// } + ///} + /// ``` + ///
+ #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct Error { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub error_code: Option, + pub message: String, + pub request_id: String, + } + + impl From<&Error> for Error { + fn from(value: &Error) -> Self { + value.clone() + } + } + + ///A single page of results + /// + ///
JSON schema + /// + /// ```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" + /// ] + /// } + /// } + ///} + /// ``` + ///
+ #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct Uint32ResultsPage { + ///list of items on this page of results + pub items: Vec, + ///token used to fetch the next page of results (if any) + #[serde(default, skip_serializing_if = "Option::is_none")] + pub next_page: Option, + } + + 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, + page_token: Option<&'a str>, + ) -> Result, 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, + ) -> impl futures::Stream>> + 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; +} diff --git a/progenitor-impl/tests/test_specific.rs b/progenitor-impl/tests/test_specific.rs index 60b2f64..d7b36fa 100644 --- a/progenitor-impl/tests/test_specific.rs +++ b/progenitor-impl/tests/test_specific.rs @@ -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, + // Record of `(offset, limit)` pairs we received + page_pairs: Mutex>, +} + +#[endpoint { + method = GET, + path = "/", +}] +async fn paginated_u32s( + rqctx: RequestContext>, + query_params: Query>, +) -> Result>, 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::(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::>(); + 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::>(); + 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"); +}