use serde::{Deserialize, Serialize};
use crate::error::JsonRpcError;
pub(crate) const VERSION: &str = "2.0";
pub(crate) const METHOD_MESSAGE_SEND: &str = "message/send";
pub(crate) const METHOD_MESSAGE_STREAM: &str = "message/stream";
pub(crate) const METHOD_TASKS_GET: &str = "tasks/get";
pub(crate) const METHOD_TASKS_LIST: &str = "tasks/list";
pub(crate) const METHOD_TASKS_CANCEL: &str = "tasks/cancel";
pub(crate) const METHOD_TASKS_RESUBSCRIBE: &str = "tasks/resubscribe";
pub(crate) const METHOD_PUSH_CONFIG_GET: &str = "tasks/pushNotificationConfig/get";
pub(crate) const METHOD_PUSH_CONFIG_CREATE: &str = "tasks/pushNotificationConfig/create";
pub(crate) const METHOD_PUSH_CONFIG_LIST: &str = "tasks/pushNotificationConfig/list";
pub(crate) const METHOD_PUSH_CONFIG_DELETE: &str = "tasks/pushNotificationConfig/delete";
pub(crate) const METHOD_GET_EXTENDED_AGENT_CARD: &str = "agent/getAuthenticatedExtendedCard";
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub(crate) enum RequestId {
String(String),
Number(i64),
}
impl Default for RequestId {
fn default() -> Self {
Self::String(uuid::Uuid::new_v4().to_string())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct JsonRpcRequest<P> {
pub jsonrpc: String,
pub id: RequestId,
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<P>,
}
impl<P> JsonRpcRequest<P> {
pub(crate) fn new(method: impl Into<String>, params: P) -> Self {
Self {
jsonrpc: VERSION.to_owned(),
id: RequestId::default(),
method: method.into(),
params: Some(params),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct JsonRpcSuccessResponse<R> {
pub jsonrpc: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<RequestId>,
pub result: R,
}
impl<R> JsonRpcSuccessResponse<R> {
pub(crate) fn new(id: Option<RequestId>, result: R) -> Self {
Self {
jsonrpc: VERSION.to_owned(),
id,
result,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct JsonRpcErrorResponse {
pub jsonrpc: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<RequestId>,
pub error: JsonRpcError,
}
impl JsonRpcErrorResponse {
pub(crate) fn new(id: Option<RequestId>, error: JsonRpcError) -> Self {
Self {
jsonrpc: VERSION.to_owned(),
id,
error,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub(crate) enum JsonRpcResponse<R> {
Success(JsonRpcSuccessResponse<R>),
Error(JsonRpcErrorResponse),
}