use serde::{Deserialize, Serialize};
use crate::protocol::{
Request,
prompts::PromptReference,
resources::ResourceReference,
};
use crate::protocol::messages::MessageResult;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompleteRequest {
pub method: String,
pub params: CompleteParams,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompleteParams {
#[serde(flatten)]
pub ref_type: CompletionReference,
pub argument: CompletionArgument,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum CompletionReference {
Prompt(PromptReference),
Resource(ResourceReference),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompletionArgument {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompleteResult {
pub completion: CompletionResults,
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub meta: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompletionResults {
pub values: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_more: Option<bool>,
}
impl Request for CompleteRequest {
const METHOD: &'static str = "completion/complete";
fn method(&self) -> &str {
&self.method
}
fn params(&self) -> Option<&serde_json::Value> {
None
}
}
impl MessageResult for CompleteResult {}
impl CompleteRequest {
pub fn for_prompt(
prompt_name: impl Into<String>,
argument_name: impl Into<String>,
argument_value: impl Into<String>,
) -> Self {
Self {
method: Self::METHOD.to_string(),
params: CompleteParams {
ref_type: CompletionReference::Prompt(PromptReference::new(prompt_name)),
argument: CompletionArgument {
name: argument_name.into(),
value: argument_value.into(),
},
},
}
}
pub fn for_resource(
resource_uri: impl Into<String>,
argument_name: impl Into<String>,
argument_value: impl Into<String>,
) -> Self {
Self {
method: Self::METHOD.to_string(),
params: CompleteParams {
ref_type: CompletionReference::Resource(ResourceReference {
r#type: "ref/resource".to_string(),
uri: resource_uri.into(),
}),
argument: CompletionArgument {
name: argument_name.into(),
value: argument_value.into(),
},
},
}
}
}
impl CompleteResult {
pub fn new(values: Vec<String>) -> Self {
Self {
completion: CompletionResults {
values,
total: None,
has_more: None,
},
meta: None,
}
}
pub fn with_pagination(
values: Vec<String>,
total: i64,
has_more: bool,
) -> Self {
Self {
completion: CompletionResults {
values,
total: Some(total),
has_more: Some(has_more),
},
meta: None,
}
}
}