#[cfg(not(feature = "std"))]
use alloc::{string::String, vec, vec::Vec};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::content::{Content, PromptMessage};
use crate::definitions::Implementation;
use crate::protocol::{ClientCapabilities, ServerCapabilities};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeRequest {
#[serde(rename = "protocolVersion")]
pub protocol_version: crate::primitives::ProtocolVersion,
pub capabilities: ClientCapabilities,
#[serde(rename = "clientInfo")]
pub client_info: Implementation,
#[serde(skip_serializing_if = "Option::is_none")]
pub _meta: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeResult {
#[serde(rename = "protocolVersion")]
pub protocol_version: crate::primitives::ProtocolVersion,
pub capabilities: ServerCapabilities,
#[serde(rename = "serverInfo")]
pub server_info: Implementation,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub _meta: Option<Value>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct InitializedNotification {}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CallToolResult {
pub content: Vec<Content>,
#[serde(rename = "isError", skip_serializing_if = "Option::is_none")]
pub is_error: Option<bool>,
#[serde(rename = "structuredContent", skip_serializing_if = "Option::is_none")]
pub structured_content: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub _meta: Option<Value>,
#[serde(rename = "taskId", skip_serializing_if = "Option::is_none")]
pub task_id: Option<String>,
}
impl CallToolResult {
#[must_use]
pub fn text(text: impl Into<String>) -> Self {
Self {
content: vec![Content::text(text)],
..Default::default()
}
}
#[must_use]
pub fn error(message: impl Into<String>) -> Self {
Self {
content: vec![Content::text(message)],
is_error: Some(true),
..Default::default()
}
}
pub fn json<T: Serialize>(value: &T) -> Result<Self, serde_json::Error> {
let text = serde_json::to_string_pretty(value)?;
Ok(Self::text(text))
}
#[must_use]
pub fn contents(contents: Vec<Content>) -> Self {
Self {
content: contents,
..Default::default()
}
}
#[must_use]
pub fn image(data: impl Into<String>, mime_type: impl Into<String>) -> Self {
Self {
content: vec![Content::image(data, mime_type)],
..Default::default()
}
}
pub fn all_text(&self) -> String {
let texts: Vec<&str> = self.content.iter().filter_map(Content::as_text).collect();
texts.join("\n")
}
pub fn first_text(&self) -> Option<&str> {
self.content.first().and_then(Content::as_text)
}
pub fn has_error(&self) -> bool {
self.is_error.unwrap_or(false)
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GetPromptResult {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub messages: Vec<PromptMessage>,
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub _meta: Option<Value>,
}