use crate::mcp::{GenericMeta, IntoMcpRequest, PromptReference, RequestMeta};
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum CompletionReference {
#[serde(rename = "ref/prompt")]
Prompt(PromptReference), #[serde(rename = "ref/resource")]
Resource(ResourceReference),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ResourceReference {
pub uri: String,
}
impl ResourceReference {
pub fn new(uri: impl Into<String>) -> Self {
Self { uri: uri.into() }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CompletionArgument {
pub name: String,
pub value: String,
}
impl CompletionArgument {
pub fn new(name: impl Into<String>, value: impl Into<String>) -> Self {
Self {
name: name.into(),
value: value.into(),
}
}
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CompleteParams {
#[serde(rename = "_meta")]
pub meta: Option<RequestMeta>,
#[serde(rename = "ref")]
pub reference: CompletionReference,
pub argument: CompletionArgument,
}
impl CompleteParams {
pub fn new(reference: CompletionReference, argument: CompletionArgument) -> Self {
Self {
meta: None,
reference,
argument,
}
}
pub fn with_meta(mut self, meta: RequestMeta) -> Self {
self.meta = Some(meta);
self
}
pub fn with_reference(mut self, reference: CompletionReference) -> Self {
self.reference = reference;
self
}
pub fn with_argument(mut self, argument: CompletionArgument) -> Self {
self.argument = argument;
self
}
}
impl IntoMcpRequest<CompleteParams> for CompleteParams {
const METHOD: &'static str = "completion/complete";
type McpResult = CompleteResult;
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CompleteResult {
#[serde(rename = "_meta")]
pub meta: Option<GenericMeta>,
pub completion: CompletionResultData,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct CompletionResultData {
pub values: Vec<String>,
pub total: Option<u64>,
pub has_more: Option<bool>,
}
impl CompletionResultData {
pub fn new() -> Self {
Self::default()
}
pub fn with_values(mut self, values: Vec<String>) -> Self {
self.values = values;
self
}
pub fn append_value(mut self, value: impl Into<String>) -> Self {
self.values.push(value.into());
self
}
pub fn with_total(mut self, total: u64) -> Self {
self.total = Some(total);
self
}
pub fn with_has_more(mut self, has_more: bool) -> Self {
self.has_more = Some(has_more);
self
}
}