diff --git a/qbittorrent-web-api-gen/src/generate/group/method/method_with_params.rs b/qbittorrent-web-api-gen/src/generate/group/method/method_with_params.rs index dcf0061..1bb2aad 100644 --- a/qbittorrent-web-api-gen/src/generate/group/method/method_with_params.rs +++ b/qbittorrent-web-api-gen/src/generate/group/method/method_with_params.rs @@ -18,37 +18,18 @@ pub fn create_method_with_params( method.name.to_camel() )); - let mandatory_params = params + let mandatory_params = mandatory_params(params); + let mandatory_param_args = mandatory_params .iter() - .filter(|param| !param.get_type_info().is_optional); + .map(|param| param_with_name(param)) + .collect::>(); - let param_name = |param: &types::Type| { - let name_as_str = param.get_type_info().name.to_snake(); - (util::to_ident(&name_as_str), name_as_str) - }; - - let param_with_name = |param: &types::Type| { - let t = util::to_ident(¶m.to_borrowed_type()); - - let (name, ..) = param_name(param); - let t = if param.should_borrow() { - quote! { &#t } - } else { - quote! { #t } - }; - - quote! { #name: #t } - }; - - let mandatory_param_args = mandatory_params.clone().map(|param| param_with_name(param)); - - let mandatory_param_names = mandatory_params.clone().map(|param| { + let mandatory_param_names = mandatory_params.iter().map(|param| { let (name, ..) = param_name(param); quote! { #name } }); - let mandatory_param_args_clone = mandatory_param_args.clone(); - let mandatory_param_form_build = mandatory_params.map(|param| { + let mandatory_param_form_build = mandatory_params.iter().map(|param| { let (name, name_as_str) = param_name(param); quote! { let form = form.text(#name_as_str, #name.to_string()); } }); @@ -56,44 +37,21 @@ pub fn create_method_with_params( let optional_params = params .iter() .filter(|param| param.get_type_info().is_optional) - .map(|param| { - let n = ¶m.get_type_info().name; - let name = util::to_ident(&n.to_snake()); - let t = util::to_ident(¶m.to_borrowed_type()); - - let builder_param = if param.should_borrow() { - quote! { &#t } - } else { - quote! { #t } - }; - - util::add_docs( - ¶m.get_type_info().description, - quote! { - pub fn #name(mut self, value: #builder_param) -> Self { - self.form = self.form.text(#n, value.to_string()); - self - } - }, - ) - }); + .map(generate_optional_parameter); let group_name = util::to_ident(&group.name.to_camel()); let send_builder = MethodBuilder::new(&util::to_ident("send"), url, quote! { self.group.auth }).with_form(); - let send_new_method = quote! { - fn new(group: &'a #group_name, #(#mandatory_param_args),*) -> Self { - let form = reqwest::multipart::Form::new(); - #(#mandatory_param_form_build)* - Self { group, form } - } - }; - let generate_send_impl = |send_method: proc_macro2::TokenStream| { quote! { impl<'a> #parameter_type<'a> { - #send_new_method + fn new(group: &'a #group_name, #(#mandatory_param_args),*) -> Self { + let form = reqwest::multipart::Form::new(); + #(#mandatory_param_form_build)* + Self { group, form } + } + #(#optional_params)* #send_method } @@ -116,7 +74,7 @@ pub fn create_method_with_params( util::add_docs( &method.description, quote! { - pub fn #method_name(&self, #(#mandatory_param_args_clone),*) -> #parameter_type { + pub fn #method_name(&self, #(#mandatory_param_args),*) -> #parameter_type { #parameter_type::new(self, #(#mandatory_param_names),*) } }, @@ -131,3 +89,48 @@ pub fn create_method_with_params( }), ) } + +fn mandatory_params(params: &[types::Type]) -> Vec<&types::Type> { + params + .iter() + .filter(|param| !param.get_type_info().is_optional) + .collect() +} + +fn generate_optional_parameter(param: &types::Type) -> proc_macro2::TokenStream { + let n = ¶m.get_type_info().name; + let name = util::to_ident(&n.to_snake()); + let t = util::to_ident(¶m.to_borrowed_type()); + let builder_param = if param.should_borrow() { + quote! { &#t } + } else { + quote! { #t } + }; + util::add_docs( + ¶m.get_type_info().description, + quote! { + pub fn #name(mut self, value: #builder_param) -> Self { + self.form = self.form.text(#n, value.to_string()); + self + } + }, + ) +} + +fn param_name(param: &types::Type) -> (proc_macro2::Ident, String) { + let name_as_str = param.get_type_info().name.to_snake(); + (util::to_ident(&name_as_str), name_as_str) +} + +fn param_with_name(param: &types::Type) -> proc_macro2::TokenStream { + let t = util::to_ident(¶m.to_borrowed_type()); + + let (name, ..) = param_name(param); + let t = if param.should_borrow() { + quote! { &#t } + } else { + quote! { #t } + }; + + quote! { #name: #t } +}