use std::{future::Future, pin::Pin};
use anyhow::Result;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
mod client;
pub use client::*;
mod server;
pub use server::*;
use crate::protocol::RequestOptions;
pub type Message = JsonRpcMessage;
#[async_trait()]
pub trait Transport: Send + Sync + 'static {
async fn open(&self) -> Result<()>;
async fn close(&self) -> Result<()>;
async fn poll_message(&self) -> Result<Option<Message>>;
fn request(
&self,
method: &str,
params: Option<serde_json::Value>,
options: RequestOptions,
) -> Pin<Box<dyn Future<Output = Result<JsonRpcResponse>> + Send + Sync>>;
async fn send_notification(
&self,
method: &str,
params: Option<serde_json::Value>,
) -> Result<()>;
async fn send_response(
&self,
id: RequestId,
result: Option<serde_json::Value>,
error: Option<JsonRpcError>,
) -> Result<()>;
}
pub type RequestId = u64;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct JsonRpcVersion(String);
impl Default for JsonRpcVersion {
fn default() -> Self {
JsonRpcVersion("2.0".to_owned())
}
}
impl JsonRpcVersion {
pub fn as_str(&self) -> &str {
&self.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
#[serde(untagged)]
pub enum JsonRpcMessage {
Response(JsonRpcResponse),
Request(JsonRpcRequest),
Notification(JsonRpcNotification),
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct JsonRpcRequest {
pub id: RequestId,
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
pub jsonrpc: JsonRpcVersion,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
#[serde(deny_unknown_fields)]
#[serde(default)]
pub struct JsonRpcNotification {
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
pub jsonrpc: JsonRpcVersion,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
#[serde(rename_all = "camelCase")]
#[serde(default)]
pub struct JsonRpcResponse {
pub id: RequestId,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<JsonRpcError>,
pub jsonrpc: JsonRpcVersion,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
#[serde(default)]
pub struct JsonRpcError {
pub code: i32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}