1use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
10pub struct ArgumentInfo {
11 pub name: String,
13 pub value: String,
15}
16
17#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
19pub struct PromptReference {
20 #[serde(rename = "type")]
22 pub ref_type: String,
23 pub name: String,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub title: Option<String>,
28}
29
30impl PromptReference {
31 pub fn new<N: Into<String>>(name: N) -> Self {
33 Self {
34 ref_type: "ref/prompt".to_string(),
35 name: name.into(),
36 title: None,
37 }
38 }
39
40 pub fn with_title<N: Into<String>, T: Into<String>>(name: N, title: T) -> Self {
42 Self {
43 ref_type: "ref/prompt".to_string(),
44 name: name.into(),
45 title: Some(title.into()),
46 }
47 }
48}
49
50#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
52pub struct PromptReferenceData {
53 pub name: String,
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub title: Option<String>,
58}
59
60#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
62pub struct ResourceTemplateReferenceData {
63 pub uri: String,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
69#[serde(tag = "type")]
70pub enum CompletionReference {
71 #[serde(rename = "ref/prompt")]
73 Prompt(PromptReferenceData),
74 #[serde(rename = "ref/resource")]
76 ResourceTemplate(ResourceTemplateReferenceData),
77}
78
79#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
81pub struct CompletionContext {
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub arguments: Option<std::collections::HashMap<String, String>>,
85}
86
87#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
89pub struct CompleteRequestParams {
90 pub argument: ArgumentInfo,
92 #[serde(rename = "ref")]
94 pub reference: CompletionReference,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub context: Option<CompletionContext>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
102pub struct CompletionOption {
103 pub value: String,
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub label: Option<String>,
108 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
110 pub completion_type: Option<String>,
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub documentation: Option<String>,
114 #[serde(rename = "sortPriority", skip_serializing_if = "Option::is_none")]
116 pub sort_priority: Option<u32>,
117 #[serde(rename = "insertText", skip_serializing_if = "Option::is_none")]
119 pub insert_text: Option<String>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
124pub struct CompletionData {
125 pub values: Vec<String>,
127 #[serde(skip_serializing_if = "Option::is_none")]
129 pub total: Option<u32>,
130 #[serde(rename = "hasMore", skip_serializing_if = "Option::is_none")]
132 pub has_more: Option<bool>,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
137pub struct CompletionResponse {
138 pub completion: CompletionData,
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub _meta: Option<serde_json::Value>,
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
147pub struct CompleteResult {
148 pub completion: CompletionData,
150 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
152 pub _meta: Option<serde_json::Value>,
153}
154
155impl CompleteResult {
156 pub fn new(completion: CompletionData) -> Self {
158 Self {
159 completion,
160 _meta: None,
161 }
162 }
163
164 pub fn with_values(values: Vec<String>) -> Self {
166 Self::new(CompletionData {
167 values,
168 total: None,
169 has_more: None,
170 })
171 }
172
173 pub fn with_values_and_total(values: Vec<String>, total: u32, has_more: bool) -> Self {
175 Self::new(CompletionData {
176 values,
177 total: Some(total),
178 has_more: Some(has_more),
179 })
180 }
181
182 pub fn with_meta(mut self, meta: serde_json::Value) -> Self {
184 self._meta = Some(meta);
185 self
186 }
187}