use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Arg(Value);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StringArg(String);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NumberArg(serde_json::Number);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BooleanArg(bool);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NullArg;
pub type Params = HashMap<String, Arg>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Request {
pub method: String,
pub params: Params,
pub ts: serde_json::Number,
pub version: String,
}
impl Request {
pub fn to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string(self)
}
}
impl From<Value> for Arg {
fn from(value: Value) -> Self {
Arg(value)
}
}
impl From<String> for Arg {
fn from(value: String) -> Self {
Arg(Value::String(value))
}
}
impl From<serde_json::Number> for Arg {
fn from(value: serde_json::Number) -> Self {
Arg(Value::Number(value))
}
}
impl From<bool> for Arg {
fn from(value: bool) -> Self {
Arg(Value::Bool(value))
}
}
impl From<()> for Arg {
fn from(_value: ()) -> Self {
Arg(Value::Null)
}
}