pub mod avm;
pub mod info;
pub mod platformvm;
pub mod subnet_evm;
use crate::errors::*;
use avalanche_types::jsonrpc::ResponseError;
pub trait JsonRpcResponse<Resp, Res>
where
Resp: serde::de::DeserializeOwned,
Res: serde::de::DeserializeOwned,
{
fn get_error(&self) -> Option<ResponseError>;
fn get_result(&self) -> Option<Res>;
}
#[macro_export]
macro_rules! impl_json_rpc_response {
($resp_type:ty, $res_type:ty) => {
impl JsonRpcResponse<$resp_type, $res_type> for $resp_type {
fn get_error(&self) -> Option<ResponseError> {
self.error.clone()
}
fn get_result(&self) -> Option<$res_type> {
self.result.clone()
}
}
};
}
pub fn get_json_rpc_req_result<Resp, Res>(
rpc_url: &str,
method: &str,
params: Option<ureq::serde_json::Value>,
) -> Result<Res, RpcError>
where
Resp: serde::de::DeserializeOwned,
Res: serde::de::DeserializeOwned,
Resp: JsonRpcResponse<Resp, Res>,
{
let resp: Resp = ureq::post(rpc_url)
.send_json(ureq::json!({
"jsonrpc": "2.0",
"method": method,
"params": params,
"id": 1
}))
.map_err(|e| RpcError::Unknown(e.to_string()))?
.into_json()
.map_err(|e| RpcError::Unknown(e.to_string()))?;
if let Some(error) = resp.get_error() {
Err(RpcError::ResponseError {
code: error.code,
message: error.message,
data: error.data,
})
} else {
Ok(resp.get_result().unwrap())
}
}