use serde::de::DeserializeOwned; use serde_json::Value; use super::errors::RpcParseError; pub trait RpcRequest: Sized { fn parse(value: Option) -> Result; } pub fn parse_params(value: Option) -> Result { if let Some(value) = value { serde_json::from_value(value) .map_err(|err| RpcParseError(format!("Failed parsing args: {err}"))) } else { Err(RpcParseError("Require at least one parameter".to_owned())) } } #[macro_export] macro_rules! parse_request { ($request_name:ty) => { impl RpcRequest for $request_name { fn parse(value: Option) -> Result { parse_params::(value) } } }; }