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 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) * 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) == 0.1.1 (released 2022-05-13)

View File

@ -283,6 +283,10 @@ impl Generator {
impl Client { impl Client {
#(#methods)* #(#methods)*
} }
pub mod prelude {
pub use super::Client;
}
}; };
Ok(out) Ok(out)
} }
@ -321,6 +325,10 @@ impl Generator {
#(#builder_struct)* #(#builder_struct)*
} }
pub mod prelude {
pub use self::super::Client;
}
}; };
Ok(out) Ok(out)
@ -335,7 +343,8 @@ impl Generator {
.map(|method| self.builder_struct(method, TagStyle::Separate)) .map(|method| self.builder_struct(method, TagStyle::Separate))
.collect::<Result<Vec<_>>>()?; .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! { let out = quote! {
#traits_and_impls #traits_and_impls
@ -352,6 +361,12 @@ impl Generator {
}; };
#(#builder_struct)* #(#builder_struct)*
}
pub mod prelude {
pub use super::Client;
#trait_preludes
} }
}; };

View File

@ -1571,10 +1571,30 @@ impl Generator {
BuilderImpl { doc, sig, body } 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( pub(crate) fn builder_tags(
&self, &self,
methods: &[OperationMethod], methods: &[OperationMethod],
) -> TokenStream { ) -> (TokenStream, TokenStream) {
let mut base = Vec::new(); let mut base = Vec::new();
let mut ext = BTreeMap::new(); let mut ext = BTreeMap::new();
@ -1616,28 +1636,40 @@ impl Generator {
} }
}); });
let ext_impl = ext.into_iter().map(|(tag, trait_methods)| { let (ext_impl, ext_use): (Vec<_>, Vec<_>) = ext
let tr = format_ident!("Client{}Ext", sanitize(&tag, Case::Pascal)); .into_iter()
let (trait_methods, trait_impls): ( .map(|(tag, trait_methods)| {
Vec<TokenStream>, let tr =
Vec<TokenStream>, format_ident!("Client{}Ext", sanitize(&tag, Case::Pascal));
) = trait_methods.into_iter().unzip(); 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! { quote! {
pub trait #tr { #base_impl
#(#trait_methods)*
}
impl #tr for Client { #(#ext_impl)*
#(#trait_impls)* },
} quote! {
} #(pub use super::#ext_use;)*
}); },
)
quote! {
#base_impl
#(#ext_impl)*
}
} }
pub(crate) fn builder_impl(&self, method: &OperationMethod) -> TokenStream { 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() .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 client = Client::new("");
let stream = client let stream = client
.instance_disk_list() .instance_disk_list()
@ -71,11 +71,12 @@ mod builder_tagged {
.stream(); .stream();
let _ = stream.collect::<Vec<_>>(); let _ = stream.collect::<Vec<_>>();
// client let _ = client
// .instance_create() .instance_create()
// .organization_name("org") .organization_name("org")
// .project_name("project") .project_name("project")
// .body(types::InstanceCreate::builder()) .body(self::nexus_client::types::InstanceCreate::builder())
// .send(); .send()
.await;
} }
} }