Add prelude for Client and extension traits (when they exist) (#176)

This commit is contained in:
Adam Leventhal 2022-08-27 08:23:02 -07:00 committed by GitHub
parent 0a4cfc5281
commit e79ac19ae7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 149 additions and 31 deletions

View File

@ -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)

View File

@ -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::<Result<Vec<_>>>()?;
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
}
};

View File

@ -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<TokenStream>,
Vec<TokenStream>,
) = 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<TokenStream>,
Vec<TokenStream>,
) = 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 {

View File

@ -2284,3 +2284,7 @@ pub mod builder {
}
}
}
pub mod prelude {
pub use super::Client;
}

View File

@ -2286,3 +2286,7 @@ pub mod builder {
}
}
}
pub mod prelude {
pub use self::super::Client;
}

View File

@ -473,3 +473,7 @@ impl Client {
}
}
}
pub mod prelude {
pub use super::Client;
}

View File

@ -1052,3 +1052,7 @@ pub mod builder {
}
}
}
pub mod prelude {
pub use super::Client;
}

View File

@ -1054,3 +1054,7 @@ pub mod builder {
}
}
}
pub mod prelude {
pub use self::super::Client;
}

View File

@ -195,3 +195,7 @@ impl Client {
}
}
}
pub mod prelude {
pub use super::Client;
}

View File

@ -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;
}

View File

@ -25229,3 +25229,7 @@ pub mod builder {
}
}
}
pub mod prelude {
pub use self::super::Client;
}

View File

@ -8776,3 +8776,7 @@ impl Client {
.boxed()
}
}
pub mod prelude {
pub use super::Client;
}

View File

@ -83,3 +83,7 @@ impl Client {
}
}
}
pub mod prelude {
pub use super::Client;
}

View File

@ -63,3 +63,7 @@ impl Client {
}
}
}
pub mod prelude {
pub use super::Client;
}

View File

@ -85,3 +85,7 @@ impl Client {
}
}
}
pub mod prelude {
pub use super::Client;
}

View File

@ -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::<Vec<_>>();
// 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;
}
}