use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<ToolCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resources: Option<ResourceCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompts: Option<PromptCapability>,
}
impl Default for ServerCapabilities {
fn default() -> Self {
Self {
tools: Some(ToolCapability::default()),
resources: Some(ResourceCapability::default()),
prompts: Some(PromptCapability::default()),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ClientCapabilities {
#[serde(default)]
pub sampling: bool,
#[serde(default)]
pub roots: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ToolCapability {
#[serde(rename = "listChanged", default)]
pub list_changed: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ResourceCapability {
#[serde(default)]
pub subscribe: bool,
#[serde(rename = "listChanged", default)]
pub list_changed: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PromptCapability {
#[serde(rename = "listChanged", default)]
pub list_changed: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_server_capabilities_default() {
let caps = ServerCapabilities::default();
assert!(caps.tools.is_some());
assert!(caps.resources.is_some());
assert!(caps.prompts.is_some());
}
#[test]
fn test_server_capabilities_serializes() {
let caps = ServerCapabilities::default();
let json = serde_json::to_value(&caps);
assert!(json.is_ok());
}
#[test]
fn test_client_capabilities_default() {
let caps = ClientCapabilities::default();
assert!(!caps.sampling);
assert!(!caps.roots);
}
}