use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub roots: Option<RootsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<SamplingCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub elicitation: Option<ElicitationCapability>,
#[cfg(feature = "tasks")]
#[serde(skip_serializing_if = "Option::is_none")]
pub tasks: Option<ClientTasksCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct RootsCapability {
#[serde(default, rename = "listChanged")]
pub list_changed: bool,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct SamplingCapability {
#[serde(skip_serializing_if = "Option::is_none")]
context: Option<SamplingContextCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
tools: Option<SamplingToolsCapability>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct SamplingContextCapability {
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct SamplingToolsCapability {
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ElicitationCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub form: Option<ElicitationFormCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<ElicitationUrlCapability>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ElicitationFormCapability {
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ElicitationUrlCapability {
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<ToolsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompts: Option<PromptsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resources: Option<ResourcesCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logging: Option<LoggingCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completions: Option<CompletionsCapability>,
#[cfg(feature = "tasks")]
#[serde(skip_serializing_if = "Option::is_none")]
pub tasks: Option<ServerTasksCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolsCapability {
#[serde(default, rename = "listChanged")]
pub list_changed: bool,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct PromptsCapability {
#[serde(default, rename = "listChanged")]
pub list_changed: bool,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ResourcesCapability {
#[serde(default, rename = "listChanged")]
pub list_changed: bool,
pub subscribe: bool,
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct LoggingCapability {
}
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct CompletionsCapability {
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ServerTasksCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub cancel: Option<TaskCancellationCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list: Option<TaskListCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requests: Option<ServerTaskRequestsCapability>,
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ClientTasksCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub cancel: Option<TaskCancellationCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list: Option<TaskListCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requests: Option<ClientTaskRequestsCapability>,
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct TaskCancellationCapability {
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct TaskListCapability {
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ServerTaskRequestsCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<ToolsTaskCapability>,
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ClientTaskRequestsCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub elicitation: Option<ElicitationTaskCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<SamplingTaskCapability>,
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolsTaskCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub call: Option<ToolsCallTaskCapability>,
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ElicitationTaskCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub create: Option<ElicitationCreateTaskCapability>,
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct SamplingTaskCapability {
#[serde(rename = "createMessage", skip_serializing_if = "Option::is_none")]
pub create: Option<SamplingCreateMessageTaskCapability>,
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ToolsCallTaskCapability {
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct ElicitationCreateTaskCapability {
}
#[cfg(feature = "tasks")]
#[derive(Default, Debug, Clone, Serialize, Deserialize)]
pub struct SamplingCreateMessageTaskCapability {
}
#[cfg(feature = "server")]
impl ToolsCapability {
pub fn with_list_changed(mut self) -> Self {
self.list_changed = true;
self
}
}
#[cfg(feature = "server")]
impl ResourcesCapability {
pub fn with_list_changed(mut self) -> Self {
self.list_changed = true;
self
}
pub fn with_subscribe(mut self) -> Self {
self.subscribe = true;
self
}
}
#[cfg(feature = "server")]
impl PromptsCapability {
pub fn with_list_changed(mut self) -> Self {
self.list_changed = true;
self
}
}
#[cfg(feature = "client")]
impl RootsCapability {
pub fn with_list_changed(mut self) -> Self {
self.list_changed = true;
self
}
}
#[cfg(feature = "client")]
impl SamplingCapability {
pub fn with_context(mut self) -> Self {
self.context = Some(SamplingContextCapability {});
self
}
pub fn with_tools(mut self) -> Self {
self.tools = Some(SamplingToolsCapability {});
self
}
}
#[cfg(feature = "client")]
impl ElicitationCapability {
pub fn with_form(mut self) -> Self {
self.form = Some(ElicitationFormCapability {});
self
}
pub fn with_url(mut self) -> Self {
self.url = Some(ElicitationUrlCapability {});
self
}
}
#[cfg(all(feature = "server", feature = "tasks"))]
impl ServerTasksCapability {
pub fn with_cancel(mut self) -> Self {
self.cancel = Some(TaskCancellationCapability {});
self
}
pub fn with_list(mut self) -> Self {
self.list = Some(TaskListCapability {});
self
}
pub fn with_requests<F>(mut self, config: F) -> Self
where
F: FnOnce(ServerTaskRequestsCapability) -> ServerTaskRequestsCapability,
{
self.requests = Some(config(Default::default()));
self
}
pub fn with_tools(self) -> Self {
self.with_requests(|req| req.with_tools())
}
pub fn with_all(self) -> Self {
self.with_cancel().with_list().with_tools()
}
}
#[cfg(all(feature = "client", feature = "tasks"))]
impl ClientTasksCapability {
pub fn with_cancel(mut self) -> Self {
self.cancel = Some(TaskCancellationCapability {});
self
}
pub fn with_list(mut self) -> Self {
self.list = Some(TaskListCapability {});
self
}
pub fn with_requests<F>(mut self, config: F) -> Self
where
F: FnOnce(ClientTaskRequestsCapability) -> ClientTaskRequestsCapability,
{
self.requests = Some(config(Default::default()));
self
}
pub fn with_elicitation(self) -> Self {
self.with_requests(|req| req.with_elicitation())
}
pub fn with_sampling(self) -> Self {
self.with_requests(|req| req.with_sampling())
}
pub fn with_all(self) -> Self {
self.with_cancel()
.with_list()
.with_elicitation()
.with_sampling()
}
}
#[cfg(all(feature = "server", feature = "tasks"))]
impl ServerTaskRequestsCapability {
pub fn with_tools(mut self) -> Self {
self.tools = Some(ToolsTaskCapability {
call: Some(ToolsCallTaskCapability {}),
});
self
}
}
#[cfg(all(feature = "client", feature = "tasks"))]
impl ClientTaskRequestsCapability {
pub fn with_elicitation(mut self) -> Self {
self.elicitation = Some(ElicitationTaskCapability {
create: Some(ElicitationCreateTaskCapability {}),
});
self
}
pub fn with_sampling(mut self) -> Self {
self.sampling = Some(SamplingTaskCapability {
create: Some(SamplingCreateMessageTaskCapability {}),
});
self
}
}