From 820f7f8980be4a2317e52aa1bc25e196c56e1eeb Mon Sep 17 00:00:00 2001 From: Yin Guanhao Date: Thu, 30 Nov 2023 11:41:43 +0800 Subject: [PATCH] feat: improve invalid params error when there are optional parameters --- examples/server-macros.rs | 6 +++--- jsonrpc-utils-macros/src/lib.rs | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/server-macros.rs b/examples/server-macros.rs index 849743c..efb682f 100644 --- a/examples/server-macros.rs +++ b/examples/server-macros.rs @@ -14,7 +14,7 @@ use jsonrpc_utils::{ trait MyRpc { async fn sleep(&self, x: u64) -> Result; async fn value(&self, x: Option) -> Result; - async fn add(&self, (x, y): (i32, i32), z: i32) -> Result; + async fn add(&self, (x, y): (i32, i32), z: Option) -> Result; #[rpc(name = "@ping")] fn ping(&self) -> Result; @@ -37,8 +37,8 @@ impl MyRpc for RpcImpl { Ok(x.unwrap_or_default()) } - async fn add(&self, (x, y): (i32, i32), z: i32) -> Result { - Ok(x + y + z) + async fn add(&self, (x, y): (i32, i32), z: Option) -> Result { + Ok(x + y + z.unwrap_or_default()) } fn ping(&self) -> Result { diff --git a/jsonrpc-utils-macros/src/lib.rs b/jsonrpc-utils-macros/src/lib.rs index d663888..e688a91 100644 --- a/jsonrpc-utils-macros/src/lib.rs +++ b/jsonrpc-utils-macros/src/lib.rs @@ -330,24 +330,26 @@ fn add_method(m: &mut TraitItemFn) -> Result { let mut arr = match params { jsonrpc_utils::jsonrpc_core::Params::Array(arr) => arr.into_iter(), jsonrpc_utils::jsonrpc_core::Params::None => Vec::new().into_iter(), - _ => return Err(jsonrpc_utils::jsonrpc_core::Error::invalid_params("")), + _ => return Err(jsonrpc_utils::jsonrpc_core::Error::invalid_params("Invalid params: invalid type map, expect an array or null")), }; }; for i in 0..required_params { let p = ¶ms_names[i]; + let p_str = LitStr::new(&p.to_string(), p.span()); let ty = params_tys[i]; parse_params.extend(quote! { - let #p: #ty = jsonrpc_utils::serde_json::from_value(arr.next().ok_or_else(|| jsonrpc_utils::jsonrpc_core::Error::invalid_params(""))?).map_err(|_| - jsonrpc_utils::jsonrpc_core::Error::invalid_params("") + let #p: #ty = jsonrpc_utils::serde_json::from_value(arr.next().ok_or_else(|| jsonrpc_utils::jsonrpc_core::Error::invalid_params(format!("Missing required parameter `{}`", #p_str)))?).map_err(|e| + jsonrpc_utils::jsonrpc_core::Error::invalid_params(format!("Invalid parameter for `{}`: {}", #p_str, e)) )?; }); } for i in required_params..params_names.len() { let p = ¶ms_names[i]; + let p_str = LitStr::new(&p.to_string(), p.span()); let ty = params_tys[i]; parse_params.extend(quote! { let #p: #ty = match arr.next() { - Some(v) => jsonrpc_utils::serde_json::from_value(v).map_err(|_| jsonrpc_utils::jsonrpc_core::Error::invalid_params(""))?, + Some(v) => jsonrpc_utils::serde_json::from_value(v).map_err(|e| jsonrpc_utils::jsonrpc_core::Error::invalid_params(format!("Invalid parameter for `{}`: {}", #p_str, e)))?, None => None, }; });