use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::server::notifications::LoggingLevel;
use crate::server::error::ServerError;
use crate::types::{Implementation, ServerCapabilities};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "method", content = "params")]
pub enum Request {
#[serde(rename = "ping")]
Ping,
#[serde(rename = "initialize")]
Initialize(InitializeParams),
#[serde(rename = "logging/setLevel")]
SetLevel(SetLevelParams),
#[serde(rename = "cancel")]
Cancel(CancelParams),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeParams {
pub protocol_version: String,
pub capabilities: HashMap<String, serde_json::Value>,
pub client_info: Implementation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeResult {
pub protocol_version: String,
pub capabilities: ServerCapabilities,
pub server_info: Implementation,
pub instructions: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SetLevelParams {
pub level: LoggingLevel,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelParams {
pub request_id: String,
pub reason: Option<String>,
}
type Result<T> = std::result::Result<T, ServerError>;
pub trait RequestHandler: Send + Sync {
fn handle(&self, request: Request) -> Result<serde_json::Value>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_request_serialization() {
let request = Request::Initialize(InitializeParams {
protocol_version: "1.0.0".to_string(),
capabilities: HashMap::new(),
client_info: Implementation {
name: "test-client".to_string(),
version: "1.0.0".to_string(),
},
});
let json = serde_json::to_string(&request).unwrap();
let deserialized: Request = serde_json::from_str(&json).unwrap();
match deserialized {
Request::Initialize(params) => {
assert_eq!(params.protocol_version, "1.0.0");
assert_eq!(params.client_info.name, "test-client");
}
_ => panic!("Wrong request type"),
}
}
}