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}