From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id C9EE661D7E for ; Fri, 18 Dec 2020 12:37:43 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 9196C2F94F for ; Fri, 18 Dec 2020 12:37:43 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 445972F837 for ; Fri, 18 Dec 2020 12:37:33 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 558B14538B for ; Fri, 18 Dec 2020 12:26:25 +0100 (CET) From: Wolfgang Bumiller To: pbs-devel@lists.proxmox.com Date: Fri, 18 Dec 2020 12:26:00 +0100 Message-Id: <20201218112608.6845-13-w.bumiller@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20201218112608.6845-1-w.bumiller@proxmox.com> References: <20201218112608.6845-1-w.bumiller@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.016 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [method.rs] Subject: [pbs-devel] [PATCH proxmox 12/18] api-macro: more tuple refactoring X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Dec 2020 11:37:43 -0000 Signed-off-by: Wolfgang Bumiller --- proxmox-api-macro/src/api/method.rs | 30 ++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/proxmox-api-macro/src/api/method.rs b/proxmox-api-macro/src/api/method.rs index d7b0021..3d6e9ed 100644 --- a/proxmox-api-macro/src/api/method.rs +++ b/proxmox-api-macro/src/api/method.rs @@ -17,7 +17,7 @@ use syn::spanned::Spanned; use syn::visit_mut::{self, VisitMut}; use syn::Ident; -use super::{Schema, SchemaItem}; +use super::{ObjectEntry, Schema, SchemaItem}; use crate::util::{self, FieldName, JSONObject, JSONValue, Maybe}; /// A return type in a schema can have an `optional` flag. Other than that it is just a regular @@ -218,7 +218,12 @@ enum ParameterType<'a> { Value, ApiMethod, RpcEnv, - Other(&'a syn::Type, bool, &'a Schema), + Normal(NormalParameter<'a>), +} + +struct NormalParameter<'a> { + ty: &'a syn::Type, + entry: &'a ObjectEntry, } fn check_input_type(input: &syn::FnArg) -> Result<(&syn::PatType, &syn::PatIdent), syn::Error> { @@ -318,7 +323,10 @@ fn handle_function_signature( } param_name = entry.name.clone(); // Found an explicit parameter: extract it: - ParameterType::Other(&pat_type.ty, entry.optional, &entry.schema) + ParameterType::Normal(NormalParameter { + ty: &pat_type.ty, + entry: &entry, + }) } else if is_api_method_type(&pat_type.ty) { if api_method_param.is_some() { error!(pat_type => "multiple ApiMethod parameters found"); @@ -449,7 +457,7 @@ fn create_wrapper_function( ParameterType::Value => args.extend(quote_spanned! { span => input_params, }), ParameterType::ApiMethod => args.extend(quote_spanned! { span => api_method_param, }), ParameterType::RpcEnv => args.extend(quote_spanned! { span => rpc_env_param, }), - ParameterType::Other(ty, optional, schema) => { + ParameterType::Normal(param) => { let name_str = syn::LitStr::new(name.as_str(), span); let arg_name = Ident::new(&format!("input_arg_{}", name.as_ident().to_string()), span); @@ -462,8 +470,8 @@ fn create_wrapper_function( .map(::serde_json::from_value) .transpose()? }); - let default_value = schema.find_schema_property("default"); - if !optional { + let default_value = param.entry.schema.find_schema_property("default"); + if !param.entry.optional { // Non-optional types need to be extracted out of the option though (unless // they have a default): // @@ -477,7 +485,7 @@ fn create_wrapper_function( ))? }); } - let no_option_type = util::is_option_type(ty).is_none(); + let no_option_type = util::is_option_type(param.ty).is_none(); if let Some(def) = &default_value { let name_uc = name.as_ident().to_string().to_uppercase(); @@ -486,20 +494,20 @@ fn create_wrapper_function( span, ); // strip possible Option<> from this type: - let ty = util::is_option_type(ty).unwrap_or(ty); + let ty = util::is_option_type(param.ty).unwrap_or(param.ty); default_consts.extend(quote_spanned! { span => pub const #name: #ty = #def; }); - if optional && no_option_type { + if param.entry.optional && no_option_type { // Optional parameter without an Option type requires a default: body.extend(quote_spanned! { span => .unwrap_or(#name) }); } - } else if optional && no_option_type { + } else if param.entry.optional && no_option_type { // FIXME: we should not be able to reach this without having produced another // error above already anyway? - error!(ty => "Optional parameter without Option requires a default"); + error!(param.ty => "Optional parameter without Option requires a default"); // we produced an error so just write something that will compile body.extend(quote_spanned! { span => .unwrap_or_else(|| unreachable!()) -- 2.20.1