use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RequestMessage {
pub jsonrpc: String,
pub id: i64,
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponseMessage {
pub jsonrpc: String,
pub id: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ResponseError>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotificationMessage {
pub jsonrpc: String,
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResponseError {
pub code: i32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_request_message_serialization() {
let request = RequestMessage {
jsonrpc: "2.0".to_string(),
id: 1,
method: "initialize".to_string(),
params: None,
};
let json = serde_json::to_string(&request).unwrap();
assert!(json.contains("\"jsonrpc\":\"2.0\""));
assert!(json.contains("\"method\":\"initialize\""));
}
#[test]
fn test_response_message_serialization() {
let response = ResponseMessage {
jsonrpc: "2.0".to_string(),
id: 1,
result: Some(serde_json::json!({"status": "ok"})),
error: None,
};
let json = serde_json::to_string(&response).unwrap();
assert!(json.contains("\"result\""));
}
}