use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub roots: Option<RootsCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<SamplingCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub elicitation: Option<ElicitationCapabilities>,
#[cfg(feature = "experimental-tasks")]
#[serde(skip_serializing_if = "Option::is_none")]
pub tasks: Option<ClientTasksCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logging: Option<LoggingCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completions: Option<CompletionCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompts: Option<PromptsCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resources: Option<ResourcesCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<ToolsCapabilities>,
#[cfg(feature = "experimental-tasks")]
#[serde(skip_serializing_if = "Option::is_none")]
pub tasks: Option<ServerTasksCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SamplingCapabilities {}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ElicitationFormCapabilities {}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ElicitationUrlCapabilities {}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
pub struct ElicitationCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub form: Option<ElicitationFormCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<ElicitationUrlCapabilities>,
#[serde(rename = "schemaValidation", skip_serializing_if = "Option::is_none")]
pub schema_validation: Option<bool>,
}
impl ElicitationCapabilities {
pub fn full() -> Self {
Self {
form: Some(ElicitationFormCapabilities {}),
url: Some(ElicitationUrlCapabilities {}),
schema_validation: None,
}
}
pub fn form_only() -> Self {
Self {
form: Some(ElicitationFormCapabilities {}),
url: None,
schema_validation: None,
}
}
pub fn supports_form(&self) -> bool {
self.form.is_some() || (self.form.is_none() && self.url.is_none())
}
pub fn supports_url(&self) -> bool {
self.url.is_some()
}
pub fn with_schema_validation(mut self) -> Self {
self.schema_validation = Some(true);
self
}
pub fn without_schema_validation(mut self) -> Self {
self.schema_validation = Some(false);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CompletionCapabilities {}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct RootsCapabilities {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct LoggingCapabilities {}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PromptsCapabilities {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ResourcesCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscribe: Option<bool>,
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ToolsCapabilities {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct ServerTasksCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub list: Option<TasksListCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cancel: Option<TasksCancelCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requests: Option<ServerTasksRequestsCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct ClientTasksCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub list: Option<TasksListCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cancel: Option<TasksCancelCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requests: Option<ClientTasksRequestsCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct TasksListCapabilities {}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct TasksCancelCapabilities {}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct ServerTasksRequestsCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<TasksToolsCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct ClientTasksRequestsCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<TasksSamplingCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub elicitation: Option<TasksElicitationCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct TasksToolsCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub call: Option<TasksToolsCallCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct TasksToolsCallCapabilities {}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct TasksSamplingCapabilities {
#[serde(rename = "createMessage", skip_serializing_if = "Option::is_none")]
pub create_message: Option<TasksSamplingCreateMessageCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct TasksSamplingCreateMessageCapabilities {}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct TasksElicitationCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub create: Option<TasksElicitationCreateCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[cfg(feature = "experimental-tasks")]
pub struct TasksElicitationCreateCapabilities {}