use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::error::Result;
#[async_trait]
pub trait Transport: Send + Sync + std::fmt::Debug + 'static {
async fn call(&self, method: &str, params: Option<Value>) -> Result<Value>;
async fn notify(&self, method: &str, params: Option<Value>) -> Result<()>;
}
#[derive(Debug, Serialize)]
pub(crate) struct JsonRpcReq<'a> {
pub jsonrpc: &'static str,
pub id: u64,
pub method: &'a str,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<Value>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct JsonRpcEnvelope {
pub id: Option<u64>,
pub method: Option<String>,
pub result: Option<Value>,
pub error: Option<JsonRpcError>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct JsonRpcError {
pub code: i32,
pub message: String,
}
impl std::fmt::Display for JsonRpcError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} ({})", self.message, self.code)
}
}