From e79ac19ae7e53ca554a99be76e5ccb44acbc57f7 Mon Sep 17 00:00:00 2001 From: Adam Leventhal Date: Sat, 27 Aug 2022 08:23:02 -0700 Subject: [PATCH] Add prelude for Client and extension traits (when they exist) (#176) --- CHANGELOG.adoc | 4 +- progenitor-impl/src/lib.rs | 17 ++++- progenitor-impl/src/method.rs | 74 +++++++++++++------ .../tests/output/buildomat-builder-tagged.out | 4 + .../tests/output/buildomat-builder.out | 4 + .../tests/output/buildomat-positional.out | 4 + .../tests/output/keeper-builder-tagged.out | 4 + .../tests/output/keeper-builder.out | 4 + .../tests/output/keeper-positional.out | 4 + .../tests/output/nexus-builder-tagged.out | 24 ++++++ .../tests/output/nexus-builder.out | 4 + .../tests/output/nexus-positional.out | 4 + .../tests/output/test_default_params.out | 4 + .../tests/output/test_freeform_response.out | 4 + .../tests/output/test_renamed_parameters.out | 4 + progenitor/tests/build_nexus.rs | 17 +++-- 16 files changed, 149 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 64a28ce..e9be2e2 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -17,7 +17,9 @@ https://github.com/oxidecomputer/progenitor/compare/v0.1.1\...HEAD[Full list of * Add support for a builder-style generation in addition to the positional style (#86) * Add support for body parameters with application/x-www-form-urlencoded media type (#109) -* Derive Debug for Client and builders for the various operations (#145) +* Derive `Debug` for `Client` and builders for the various operations (#145) +* Builders for `struct` types (#171) +* Add a prelude that include the `Client` and any extension traits (#176) == 0.1.1 (released 2022-05-13) diff --git a/progenitor-impl/src/lib.rs b/progenitor-impl/src/lib.rs index 4fa0cf8..b3beeb1 100644 --- a/progenitor-impl/src/lib.rs +++ b/progenitor-impl/src/lib.rs @@ -283,6 +283,10 @@ impl Generator { impl Client { #(#methods)* } + + pub mod prelude { + pub use super::Client; + } }; Ok(out) } @@ -321,6 +325,10 @@ impl Generator { #(#builder_struct)* } + + pub mod prelude { + pub use self::super::Client; + } }; Ok(out) @@ -335,7 +343,8 @@ impl Generator { .map(|method| self.builder_struct(method, TagStyle::Separate)) .collect::>>()?; - let traits_and_impls = self.builder_tags(input_methods); + let (traits_and_impls, trait_preludes) = + self.builder_tags(input_methods); let out = quote! { #traits_and_impls @@ -352,6 +361,12 @@ impl Generator { }; #(#builder_struct)* + + } + + pub mod prelude { + pub use super::Client; + #trait_preludes } }; diff --git a/progenitor-impl/src/method.rs b/progenitor-impl/src/method.rs index bb157c9..97d7d23 100644 --- a/progenitor-impl/src/method.rs +++ b/progenitor-impl/src/method.rs @@ -1571,10 +1571,30 @@ impl Generator { BuilderImpl { doc, sig, body } } + /// Generates a pair of TokenStreams. + /// + /// The first includes all the operation code; impl Client for operations + /// with no tags and code of this form for each tag: + /// + /// ```ignore + /// pub trait ClientTagExt { + /// ... + /// } + /// + /// impl ClientTagExt for Client { + /// ... + /// } + /// ``` + /// + /// The second is the code for the prelude for each tag extension trait: + /// + /// ```ignore + /// pub use super::ClientTagExt; + /// ``` pub(crate) fn builder_tags( &self, methods: &[OperationMethod], - ) -> TokenStream { + ) -> (TokenStream, TokenStream) { let mut base = Vec::new(); let mut ext = BTreeMap::new(); @@ -1616,28 +1636,40 @@ impl Generator { } }); - let ext_impl = ext.into_iter().map(|(tag, trait_methods)| { - let tr = format_ident!("Client{}Ext", sanitize(&tag, Case::Pascal)); - let (trait_methods, trait_impls): ( - Vec, - Vec, - ) = trait_methods.into_iter().unzip(); + let (ext_impl, ext_use): (Vec<_>, Vec<_>) = ext + .into_iter() + .map(|(tag, trait_methods)| { + let tr = + format_ident!("Client{}Ext", sanitize(&tag, Case::Pascal)); + let (trait_methods, trait_impls): ( + Vec, + Vec, + ) = trait_methods.into_iter().unzip(); + ( + quote! { + pub trait #tr { + #(#trait_methods)* + } + + impl #tr for Client { + #(#trait_impls)* + } + }, + tr, + ) + }) + .unzip(); + + ( quote! { - pub trait #tr { - #(#trait_methods)* - } + #base_impl - impl #tr for Client { - #(#trait_impls)* - } - } - }); - - quote! { - #base_impl - - #(#ext_impl)* - } + #(#ext_impl)* + }, + quote! { + #(pub use super::#ext_use;)* + }, + ) } pub(crate) fn builder_impl(&self, method: &OperationMethod) -> TokenStream { diff --git a/progenitor-impl/tests/output/buildomat-builder-tagged.out b/progenitor-impl/tests/output/buildomat-builder-tagged.out index 6f71fd3..fe9815c 100644 --- a/progenitor-impl/tests/output/buildomat-builder-tagged.out +++ b/progenitor-impl/tests/output/buildomat-builder-tagged.out @@ -2284,3 +2284,7 @@ pub mod builder { } } } + +pub mod prelude { + pub use super::Client; +} diff --git a/progenitor-impl/tests/output/buildomat-builder.out b/progenitor-impl/tests/output/buildomat-builder.out index c049ccb..e1d4c58 100644 --- a/progenitor-impl/tests/output/buildomat-builder.out +++ b/progenitor-impl/tests/output/buildomat-builder.out @@ -2286,3 +2286,7 @@ pub mod builder { } } } + +pub mod prelude { + pub use self::super::Client; +} diff --git a/progenitor-impl/tests/output/buildomat-positional.out b/progenitor-impl/tests/output/buildomat-positional.out index b538e81..6a039bb 100644 --- a/progenitor-impl/tests/output/buildomat-positional.out +++ b/progenitor-impl/tests/output/buildomat-positional.out @@ -473,3 +473,7 @@ impl Client { } } } + +pub mod prelude { + pub use super::Client; +} diff --git a/progenitor-impl/tests/output/keeper-builder-tagged.out b/progenitor-impl/tests/output/keeper-builder-tagged.out index 6bb6b4b..00f1772 100644 --- a/progenitor-impl/tests/output/keeper-builder-tagged.out +++ b/progenitor-impl/tests/output/keeper-builder-tagged.out @@ -1052,3 +1052,7 @@ pub mod builder { } } } + +pub mod prelude { + pub use super::Client; +} diff --git a/progenitor-impl/tests/output/keeper-builder.out b/progenitor-impl/tests/output/keeper-builder.out index 1b5e554..bb334b2 100644 --- a/progenitor-impl/tests/output/keeper-builder.out +++ b/progenitor-impl/tests/output/keeper-builder.out @@ -1054,3 +1054,7 @@ pub mod builder { } } } + +pub mod prelude { + pub use self::super::Client; +} diff --git a/progenitor-impl/tests/output/keeper-positional.out b/progenitor-impl/tests/output/keeper-positional.out index fbf3d42..6a3bf9c 100644 --- a/progenitor-impl/tests/output/keeper-positional.out +++ b/progenitor-impl/tests/output/keeper-positional.out @@ -195,3 +195,7 @@ impl Client { } } } + +pub mod prelude { + pub use super::Client; +} diff --git a/progenitor-impl/tests/output/nexus-builder-tagged.out b/progenitor-impl/tests/output/nexus-builder-tagged.out index 9f2a018..4c1f9f1 100644 --- a/progenitor-impl/tests/output/nexus-builder-tagged.out +++ b/progenitor-impl/tests/output/nexus-builder-tagged.out @@ -25408,3 +25408,27 @@ pub mod builder { } } } + +pub mod prelude { + pub use super::Client; + pub use super::ClientDisksExt; + pub use super::ClientHardwareExt; + pub use super::ClientHiddenExt; + pub use super::ClientImagesExt; + pub use super::ClientImagesGlobalExt; + pub use super::ClientInstancesExt; + pub use super::ClientIpPoolsExt; + pub use super::ClientLoginExt; + pub use super::ClientMetricsExt; + pub use super::ClientOrganizationsExt; + pub use super::ClientPolicyExt; + pub use super::ClientProjectsExt; + pub use super::ClientRolesExt; + pub use super::ClientSagasExt; + pub use super::ClientSessionExt; + pub use super::ClientSilosExt; + pub use super::ClientSnapshotsExt; + pub use super::ClientSystemExt; + pub use super::ClientUpdatesExt; + pub use super::ClientVpcsExt; +} diff --git a/progenitor-impl/tests/output/nexus-builder.out b/progenitor-impl/tests/output/nexus-builder.out index 637c71a..46857e8 100644 --- a/progenitor-impl/tests/output/nexus-builder.out +++ b/progenitor-impl/tests/output/nexus-builder.out @@ -25229,3 +25229,7 @@ pub mod builder { } } } + +pub mod prelude { + pub use self::super::Client; +} diff --git a/progenitor-impl/tests/output/nexus-positional.out b/progenitor-impl/tests/output/nexus-positional.out index 2a51043..916cfb7 100644 --- a/progenitor-impl/tests/output/nexus-positional.out +++ b/progenitor-impl/tests/output/nexus-positional.out @@ -8776,3 +8776,7 @@ impl Client { .boxed() } } + +pub mod prelude { + pub use super::Client; +} diff --git a/progenitor-impl/tests/output/test_default_params.out b/progenitor-impl/tests/output/test_default_params.out index 7493588..b269aa9 100644 --- a/progenitor-impl/tests/output/test_default_params.out +++ b/progenitor-impl/tests/output/test_default_params.out @@ -83,3 +83,7 @@ impl Client { } } } + +pub mod prelude { + pub use super::Client; +} diff --git a/progenitor-impl/tests/output/test_freeform_response.out b/progenitor-impl/tests/output/test_freeform_response.out index 5e39a82..97216ca 100644 --- a/progenitor-impl/tests/output/test_freeform_response.out +++ b/progenitor-impl/tests/output/test_freeform_response.out @@ -63,3 +63,7 @@ impl Client { } } } + +pub mod prelude { + pub use super::Client; +} diff --git a/progenitor-impl/tests/output/test_renamed_parameters.out b/progenitor-impl/tests/output/test_renamed_parameters.out index ca6cbee..8f13e28 100644 --- a/progenitor-impl/tests/output/test_renamed_parameters.out +++ b/progenitor-impl/tests/output/test_renamed_parameters.out @@ -85,3 +85,7 @@ impl Client { } } } + +pub mod prelude { + pub use super::Client; +} diff --git a/progenitor/tests/build_nexus.rs b/progenitor/tests/build_nexus.rs index 4dcce28..a612d32 100644 --- a/progenitor/tests/build_nexus.rs +++ b/progenitor/tests/build_nexus.rs @@ -59,9 +59,9 @@ mod builder_tagged { ); } - use nexus_client::{Client, ClientInstancesExt}; + use nexus_client::prelude::*; - fn _ignore() { + async fn _ignore() { let client = Client::new(""); let stream = client .instance_disk_list() @@ -71,11 +71,12 @@ mod builder_tagged { .stream(); let _ = stream.collect::>(); - // client - // .instance_create() - // .organization_name("org") - // .project_name("project") - // .body(types::InstanceCreate::builder()) - // .send(); + let _ = client + .instance_create() + .organization_name("org") + .project_name("project") + .body(self::nexus_client::types::InstanceCreate::builder()) + .send() + .await; } }