Skip to content

Commit 54f21ac

Browse files
JosiahBullahl
andauthored
fix(progenitor-macro): if 'client.inner' is not set by user do not provide it to user-specified functions. (#933)
Co-authored-by: Adam H. Leventhal <[email protected]>
1 parent 7cbb3d9 commit 54f21ac

File tree

3 files changed

+40
-19
lines changed

3 files changed

+40
-19
lines changed

example-macro/src/main.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use progenitor::generate_api;
44

55
generate_api!(
66
spec = "../sample_openapi/keeper.json",
7-
inner_type = (),
8-
pre_hook = (|_, request| {
7+
pre_hook = (|request| {
98
println!("doing this {:?}", request);
109
}),
1110
pre_hook_async = crate::add_auth_headers,
@@ -14,7 +13,6 @@ generate_api!(
1413
);
1514

1615
async fn add_auth_headers(
17-
_: &(),
1816
req: &mut reqwest::Request,
1917
) -> Result<(), reqwest::header::InvalidHeaderValue> {
2018
// You can perform asynchronous, fallible work in a request hook, then
@@ -29,7 +27,7 @@ async fn add_auth_headers(
2927
Ok(())
3028
}
3129

32-
fn all_done(_: &(), _result: &reqwest::Result<reqwest::Response>) {}
30+
fn all_done(_result: &reqwest::Result<reqwest::Response>) {}
3331

3432
mod buildomat {
3533
use progenitor::generate_api;

progenitor-impl/src/lib.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -337,22 +337,30 @@ impl Generator {
337337
&self.settings.interface,
338338
&self.settings.tag,
339339
) {
340-
(InterfaceStyle::Positional, TagStyle::Merged) => {
341-
self.generate_tokens_positional_merged(&raw_methods)
342-
}
340+
(InterfaceStyle::Positional, TagStyle::Merged) => self
341+
.generate_tokens_positional_merged(
342+
&raw_methods,
343+
self.settings.inner_type.is_some(),
344+
),
343345
(InterfaceStyle::Positional, TagStyle::Separate) => {
344346
unimplemented!("positional arguments with separate tags are currently unsupported")
345347
}
346-
(InterfaceStyle::Builder, TagStyle::Merged) => {
347-
self.generate_tokens_builder_merged(&raw_methods)
348-
}
348+
(InterfaceStyle::Builder, TagStyle::Merged) => self
349+
.generate_tokens_builder_merged(
350+
&raw_methods,
351+
self.settings.inner_type.is_some(),
352+
),
349353
(InterfaceStyle::Builder, TagStyle::Separate) => {
350354
let tag_info = spec
351355
.tags
352356
.iter()
353357
.map(|tag| (&tag.name, tag))
354358
.collect::<BTreeMap<_, _>>();
355-
self.generate_tokens_builder_separate(&raw_methods, tag_info)
359+
self.generate_tokens_builder_separate(
360+
&raw_methods,
361+
tag_info,
362+
self.settings.inner_type.is_some(),
363+
)
356364
}
357365
}?;
358366

@@ -503,10 +511,11 @@ impl Generator {
503511
fn generate_tokens_positional_merged(
504512
&mut self,
505513
input_methods: &[method::OperationMethod],
514+
has_inner: bool,
506515
) -> Result<TokenStream> {
507516
let methods = input_methods
508517
.iter()
509-
.map(|method| self.positional_method(method))
518+
.map(|method| self.positional_method(method, has_inner))
510519
.collect::<Result<Vec<_>>>()?;
511520

512521
// The allow(unused_imports) on the `pub use` is necessary with Rust 1.76+, in case the
@@ -530,10 +539,13 @@ impl Generator {
530539
fn generate_tokens_builder_merged(
531540
&mut self,
532541
input_methods: &[method::OperationMethod],
542+
has_inner: bool,
533543
) -> Result<TokenStream> {
534544
let builder_struct = input_methods
535545
.iter()
536-
.map(|method| self.builder_struct(method, TagStyle::Merged))
546+
.map(|method| {
547+
self.builder_struct(method, TagStyle::Merged, has_inner)
548+
})
537549
.collect::<Result<Vec<_>>>()?;
538550

539551
let builder_methods = input_methods
@@ -577,10 +589,13 @@ impl Generator {
577589
&mut self,
578590
input_methods: &[method::OperationMethod],
579591
tag_info: BTreeMap<&String, &openapiv3::Tag>,
592+
has_inner: bool,
580593
) -> Result<TokenStream> {
581594
let builder_struct = input_methods
582595
.iter()
583-
.map(|method| self.builder_struct(method, TagStyle::Separate))
596+
.map(|method| {
597+
self.builder_struct(method, TagStyle::Separate, has_inner)
598+
})
584599
.collect::<Result<Vec<_>>>()?;
585600

586601
let (traits_and_impls, trait_preludes) =

progenitor-impl/src/method.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,7 @@ impl Generator {
592592
pub(crate) fn positional_method(
593593
&mut self,
594594
method: &OperationMethod,
595+
has_inner: bool,
595596
) -> Result<TokenStream> {
596597
let operation_id = format_ident!("{}", method.operation_id);
597598

@@ -658,7 +659,7 @@ impl Generator {
658659
success: success_type,
659660
error: error_type,
660661
body,
661-
} = self.method_sig_body(method, quote! { self })?;
662+
} = self.method_sig_body(method, quote! { self }, has_inner)?;
662663

663664
let method_impl = quote! {
664665
#[doc = #doc_comment]
@@ -814,6 +815,7 @@ impl Generator {
814815
&self,
815816
method: &OperationMethod,
816817
client: TokenStream,
818+
has_inner: bool,
817819
) -> Result<MethodSigBody> {
818820
let param_names = method
819821
.params
@@ -1129,22 +1131,26 @@ impl Generator {
11291131
}
11301132
};
11311133

1134+
let inner = match has_inner {
1135+
true => quote! { &#client.inner, },
1136+
false => quote! {},
1137+
};
11321138
let pre_hook = self.settings.pre_hook.as_ref().map(|hook| {
11331139
quote! {
1134-
(#hook)(&#client.inner, &#request_ident);
1140+
(#hook)(#inner &#request_ident);
11351141
}
11361142
});
11371143
let pre_hook_async = self.settings.pre_hook_async.as_ref().map(|hook| {
11381144
quote! {
1139-
match (#hook)(&#client.inner, &mut #request_ident).await {
1145+
match (#hook)(#inner &mut #request_ident).await {
11401146
Ok(_) => (),
11411147
Err(e) => return Err(Error::PreHookError(e.to_string())),
11421148
}
11431149
}
11441150
});
11451151
let post_hook = self.settings.post_hook.as_ref().map(|hook| {
11461152
quote! {
1147-
(#hook)(&#client.inner, &#result_ident);
1153+
(#hook)(#inner &#result_ident);
11481154
}
11491155
});
11501156

@@ -1474,6 +1480,7 @@ impl Generator {
14741480
&mut self,
14751481
method: &OperationMethod,
14761482
tag_style: TagStyle,
1483+
has_inner: bool,
14771484
) -> Result<TokenStream> {
14781485
let struct_name = sanitize(&method.operation_id, Case::Pascal);
14791486
let struct_ident = format_ident!("{}", struct_name);
@@ -1718,7 +1725,8 @@ impl Generator {
17181725
success,
17191726
error,
17201727
body,
1721-
} = self.method_sig_body(method, quote! { #client_ident })?;
1728+
} =
1729+
self.method_sig_body(method, quote! { #client_ident }, has_inner)?;
17221730

17231731
let send_doc = format!(
17241732
"Sends a `{}` request to `{}`",

0 commit comments

Comments
 (0)