use serde::{Deserialize, Serialize};
use serde_json::{Value, Map};
use crate::version::Version;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Params {
Array(Vec<Value>),
Object(Map<String, Value>),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Id {
String(String),
Number(u64),
Null,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Request {
#[serde(skip_serializing_if = "Option::is_none")]
pub jsonrpc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<Params>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<Id>,
}
impl Request {
pub fn new(method: String, params: Option<Params>, id: Option<Id>) -> Self {
Request::new_v2(method, params, id)
}
pub fn new_v2(method: String, params: Option<Params>, id: Option<Id>) -> Self {
Request {
jsonrpc: Some("2.0".to_string()),
version: None,
method,
params,
id,
}
}
pub fn new_v1_1(method: String, params: Option<Params>, id: Option<Id>) -> Self {
Request {
jsonrpc: None,
version: Some("1.1".to_string()),
method,
params,
id,
}
}
pub fn new_v1(method: String, params: Option<Params>, id: Option<Id>) -> Self {
Request {
jsonrpc: None,
version: None,
method,
params,
id,
}
}
pub fn notification(method: String, params: Option<Params>) -> Self {
Request::notification_v2(method, params)
}
pub fn notification_v2(method: String, params: Option<Params>) -> Self {
Request {
jsonrpc: Some("2.0".to_string()),
version: None,
method,
params,
id: None,
}
}
pub fn is_notification(&self) -> bool {
self.id.is_none()
}
pub fn version(&self) -> Option<Version> {
if self.jsonrpc.is_some() {
Version::from_str(self.jsonrpc.as_ref().unwrap())
} else if self.version.is_some() {
Version::from_str(self.version.as_ref().unwrap())
} else {
Some(Version::V1_0)
}
}
}