2024-09-30 05:49:46 +03:00
|
|
|
use serde::de::DeserializeOwned;
|
|
|
|
|
use serde_json::Value;
|
|
|
|
|
|
2025-04-16 16:17:53 +03:00
|
|
|
use super::errors::RpcParseError;
|
2024-09-30 05:49:46 +03:00
|
|
|
|
|
|
|
|
pub trait RpcRequest: Sized {
|
|
|
|
|
fn parse(value: Option<Value>) -> Result<Self, RpcParseError>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn parse_params<T: DeserializeOwned>(value: Option<Value>) -> Result<T, RpcParseError> {
|
|
|
|
|
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<Value>) -> Result<Self, RpcParseError> {
|
|
|
|
|
parse_params::<Self>(value)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|