From dcd8ee2b617ea680a97565871ea4ef90195bb6c1 Mon Sep 17 00:00:00 2001 From: Josiah Bull Date: Wed, 2 Oct 2024 10:09:10 +1300 Subject: [PATCH] fix(progenitor-macro): if 'client.inner' is not set by user do not provide it to user-specified functions. --- example-macro/src/main.rs | 6 ++---- progenitor-impl/src/lib.rs | 15 +++++++++------ progenitor-impl/src/method.rs | 17 ++++++++++++----- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/example-macro/src/main.rs b/example-macro/src/main.rs index 37e0012c..5ace903b 100644 --- a/example-macro/src/main.rs +++ b/example-macro/src/main.rs @@ -4,8 +4,7 @@ use progenitor::generate_api; generate_api!( spec = "../sample_openapi/keeper.json", - inner_type = (), - pre_hook = (|_, request| { + pre_hook = (|request| { println!("doing this {:?}", request); }), pre_hook_async = crate::add_auth_headers, @@ -14,7 +13,6 @@ generate_api!( ); async fn add_auth_headers( - _: &(), req: &mut reqwest::Request, ) -> Result<(), reqwest::header::InvalidHeaderValue> { // You can perform asynchronous, fallible work in a request hook, then @@ -29,7 +27,7 @@ async fn add_auth_headers( Ok(()) } -fn all_done(_: &(), _result: &reqwest::Result) {} +fn all_done(_result: &reqwest::Result) {} mod buildomat { use progenitor::generate_api; diff --git a/progenitor-impl/src/lib.rs b/progenitor-impl/src/lib.rs index 564c74da..ceed9c4c 100644 --- a/progenitor-impl/src/lib.rs +++ b/progenitor-impl/src/lib.rs @@ -338,13 +338,13 @@ impl Generator { &self.settings.tag, ) { (InterfaceStyle::Positional, TagStyle::Merged) => { - self.generate_tokens_positional_merged(&raw_methods) + self.generate_tokens_positional_merged(&raw_methods, self.settings.inner_type.is_some()) } (InterfaceStyle::Positional, TagStyle::Separate) => { unimplemented!("positional arguments with separate tags are currently unsupported") } (InterfaceStyle::Builder, TagStyle::Merged) => { - self.generate_tokens_builder_merged(&raw_methods) + self.generate_tokens_builder_merged(&raw_methods, self.settings.inner_type.is_some()) } (InterfaceStyle::Builder, TagStyle::Separate) => { let tag_info = spec @@ -352,7 +352,7 @@ impl Generator { .iter() .map(|tag| (&tag.name, tag)) .collect::>(); - self.generate_tokens_builder_separate(&raw_methods, tag_info) + self.generate_tokens_builder_separate(&raw_methods, tag_info, self.settings.inner_type.is_some()) } }?; @@ -503,10 +503,11 @@ impl Generator { fn generate_tokens_positional_merged( &mut self, input_methods: &[method::OperationMethod], + has_inner: bool, ) -> Result { let methods = input_methods .iter() - .map(|method| self.positional_method(method)) + .map(|method| self.positional_method(method, has_inner)) .collect::>>()?; // The allow(unused_imports) on the `pub use` is necessary with Rust 1.76+, in case the @@ -530,10 +531,11 @@ impl Generator { fn generate_tokens_builder_merged( &mut self, input_methods: &[method::OperationMethod], + has_inner: bool, ) -> Result { let builder_struct = input_methods .iter() - .map(|method| self.builder_struct(method, TagStyle::Merged)) + .map(|method| self.builder_struct(method, TagStyle::Merged, has_inner)) .collect::>>()?; let builder_methods = input_methods @@ -577,10 +579,11 @@ impl Generator { &mut self, input_methods: &[method::OperationMethod], tag_info: BTreeMap<&String, &openapiv3::Tag>, + has_inner: bool, ) -> Result { let builder_struct = input_methods .iter() - .map(|method| self.builder_struct(method, TagStyle::Separate)) + .map(|method| self.builder_struct(method, TagStyle::Separate, has_inner)) .collect::>>()?; let (traits_and_impls, trait_preludes) = diff --git a/progenitor-impl/src/method.rs b/progenitor-impl/src/method.rs index 2c2a731b..91aa069d 100644 --- a/progenitor-impl/src/method.rs +++ b/progenitor-impl/src/method.rs @@ -592,6 +592,7 @@ impl Generator { pub(crate) fn positional_method( &mut self, method: &OperationMethod, + has_inner: bool, ) -> Result { let operation_id = format_ident!("{}", method.operation_id); @@ -658,7 +659,7 @@ impl Generator { success: success_type, error: error_type, body, - } = self.method_sig_body(method, quote! { self })?; + } = self.method_sig_body(method, quote! { self }, has_inner)?; let method_impl = quote! { #[doc = #doc_comment] @@ -814,6 +815,7 @@ impl Generator { &self, method: &OperationMethod, client: TokenStream, + has_inner: bool, ) -> Result { let param_names = method .params @@ -1129,14 +1131,18 @@ impl Generator { } }; + let inner = match has_inner { + true => quote! { &#client.inner, }, + false => quote! { }, + }; let pre_hook = self.settings.pre_hook.as_ref().map(|hook| { quote! { - (#hook)(&#client.inner, &#request_ident); + (#hook)(#inner &#request_ident); } }); let pre_hook_async = self.settings.pre_hook_async.as_ref().map(|hook| { quote! { - match (#hook)(&#client.inner, &mut #request_ident).await { + match (#hook)(#inner &mut #request_ident).await { Ok(_) => (), Err(e) => return Err(Error::PreHookError(e.to_string())), } @@ -1144,7 +1150,7 @@ impl Generator { }); let post_hook = self.settings.post_hook.as_ref().map(|hook| { quote! { - (#hook)(&#client.inner, &#result_ident); + (#hook)(#inner &#result_ident); } }); @@ -1474,6 +1480,7 @@ impl Generator { &mut self, method: &OperationMethod, tag_style: TagStyle, + has_inner: bool ) -> Result { let struct_name = sanitize(&method.operation_id, Case::Pascal); let struct_ident = format_ident!("{}", struct_name); @@ -1718,7 +1725,7 @@ impl Generator { success, error, body, - } = self.method_sig_body(method, quote! { #client_ident })?; + } = self.method_sig_body(method, quote! { #client_ident }, has_inner)?; let send_doc = format!( "Sends a `{}` request to `{}`",