use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ArgumentInfo {
pub name: String,
pub value: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct PromptReference {
#[serde(rename = "type")]
pub ref_type: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
impl PromptReference {
pub fn new<N: Into<String>>(name: N) -> Self {
Self {
ref_type: "ref/prompt".to_string(),
name: name.into(),
title: None,
}
}
pub fn with_title<N: Into<String>, T: Into<String>>(name: N, title: T) -> Self {
Self {
ref_type: "ref/prompt".to_string(),
name: name.into(),
title: Some(title.into()),
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct PromptReferenceData {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ResourceTemplateReferenceData {
pub uri: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum CompletionReference {
#[serde(rename = "ref/prompt")]
Prompt(PromptReferenceData),
#[serde(rename = "ref/resource")]
ResourceTemplate(ResourceTemplateReferenceData),
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CompletionContext {
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<std::collections::HashMap<String, String>>,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct CompleteRequestParams {
pub argument: ArgumentInfo,
#[serde(rename = "ref")]
pub reference: CompletionReference,
#[serde(skip_serializing_if = "Option::is_none")]
pub context: Option<CompletionContext>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompletionOption {
pub value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub completion_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(rename = "sortPriority", skip_serializing_if = "Option::is_none")]
pub sort_priority: Option<u32>,
#[serde(rename = "insertText", skip_serializing_if = "Option::is_none")]
pub insert_text: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompletionData {
pub values: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total: Option<u32>,
#[serde(rename = "hasMore", skip_serializing_if = "Option::is_none")]
pub has_more: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompletionResponse {
pub completion: CompletionData,
#[serde(skip_serializing_if = "Option::is_none")]
pub _meta: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompleteResult {
pub completion: CompletionData,
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub _meta: Option<serde_json::Value>,
}
impl CompleteResult {
pub fn new(completion: CompletionData) -> Self {
Self {
completion,
_meta: None,
}
}
pub fn with_values(values: Vec<String>) -> Self {
Self::new(CompletionData {
values,
total: None,
has_more: None,
})
}
pub fn with_values_and_total(values: Vec<String>, total: u32, has_more: bool) -> Self {
Self::new(CompletionData {
values,
total: Some(total),
has_more: Some(has_more),
})
}
pub fn with_meta(mut self, meta: serde_json::Value) -> Self {
self._meta = Some(meta);
self
}
}