1use serde::{Deserialize, Serialize};
18use std::collections::HashMap;
19
20use super::core::{Annotations, Base64String, MimeType, Uri};
21
22#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
24#[serde(rename_all = "lowercase")]
25pub enum ContentType {
26 Json,
28 Binary,
30 Text,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
36#[serde(tag = "type")]
37pub enum ContentBlock {
38 #[serde(rename = "text")]
40 Text(TextContent),
41 #[serde(rename = "image")]
43 Image(ImageContent),
44 #[serde(rename = "audio")]
46 Audio(AudioContent),
47 #[serde(rename = "resource_link")]
49 ResourceLink(ResourceLink),
50 #[serde(rename = "resource")]
52 Resource(EmbeddedResource),
53}
54
55pub type Content = ContentBlock;
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct TextContent {
61 pub text: String,
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub annotations: Option<Annotations>,
66 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
68 pub meta: Option<HashMap<String, serde_json::Value>>,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct ImageContent {
74 pub data: Base64String,
76 #[serde(rename = "mimeType")]
78 pub mime_type: MimeType,
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub annotations: Option<Annotations>,
82 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
84 pub meta: Option<HashMap<String, serde_json::Value>>,
85}
86
87#[derive(Debug, Clone, Serialize, Deserialize)]
89pub struct AudioContent {
90 pub data: Base64String,
92 #[serde(rename = "mimeType")]
94 pub mime_type: MimeType,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub annotations: Option<Annotations>,
98 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
100 pub meta: Option<HashMap<String, serde_json::Value>>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct ResourceLink {
106 pub name: String,
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub title: Option<String>,
111 pub uri: Uri,
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub description: Option<String>,
116 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
118 pub mime_type: Option<MimeType>,
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub annotations: Option<Annotations>,
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub size: Option<u64>,
125 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
127 pub meta: Option<HashMap<String, serde_json::Value>>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
132pub struct EmbeddedResource {
133 pub resource: ResourceContent,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub annotations: Option<Annotations>,
138 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
140 pub meta: Option<HashMap<String, serde_json::Value>>,
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct TextResourceContents {
146 pub uri: Uri,
148 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
150 pub mime_type: Option<MimeType>,
151 pub text: String,
153 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
155 pub meta: Option<HashMap<String, serde_json::Value>>,
156}
157
158#[derive(Debug, Clone, Serialize, Deserialize)]
160pub struct BlobResourceContents {
161 pub uri: Uri,
163 #[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
165 pub mime_type: Option<MimeType>,
166 pub blob: Base64String,
168 #[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
170 pub meta: Option<HashMap<String, serde_json::Value>>,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
175#[serde(untagged)]
176pub enum ResourceContent {
177 Text(TextResourceContents),
179 Blob(BlobResourceContents),
181}