Skip to main content

systemprompt_models/a2a/
message.rs

1use serde::{Deserialize, Serialize};
2use systemprompt_identifiers::{ContextId, MessageId, TaskId};
3
4#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
5pub struct Message {
6    pub role: String,
7    pub parts: Vec<Part>,
8    #[serde(rename = "messageId")]
9    pub id: MessageId,
10    #[serde(rename = "taskId")]
11    pub task_id: Option<TaskId>,
12    #[serde(rename = "contextId")]
13    pub context_id: ContextId,
14    #[serde(rename = "kind")]
15    pub kind: String,
16    pub metadata: Option<serde_json::Value>,
17    pub extensions: Option<Vec<String>>,
18    #[serde(rename = "referenceTaskIds")]
19    pub reference_task_ids: Option<Vec<TaskId>>,
20}
21
22#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
23#[serde(rename_all = "lowercase")]
24pub enum MessageRole {
25    User,
26    Agent,
27}
28
29#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
30#[serde(tag = "kind")]
31pub enum Part {
32    #[serde(rename = "text")]
33    Text(TextPart),
34    #[serde(rename = "data")]
35    Data(DataPart),
36    #[serde(rename = "file")]
37    File(FilePart),
38}
39
40#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
41pub struct TextPart {
42    pub text: String,
43}
44
45#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
46pub struct DataPart {
47    pub data: serde_json::Map<String, serde_json::Value>,
48}
49
50#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
51pub struct FilePart {
52    pub file: FileWithBytes,
53}
54
55#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
56pub struct FileWithBytes {
57    pub name: Option<String>,
58    #[serde(rename = "mimeType")]
59    pub mime_type: Option<String>,
60    pub bytes: String,
61}
62
63impl Part {
64    pub fn as_text(&self) -> Option<&str> {
65        match self {
66            Self::Text(text_part) => Some(&text_part.text),
67            _ => None,
68        }
69    }
70
71    pub fn as_data(&self) -> Option<serde_json::Value> {
72        match self {
73            Self::Data(data_part) => Some(serde_json::Value::Object(data_part.data.clone())),
74            _ => None,
75        }
76    }
77
78    pub fn as_file(&self) -> Option<serde_json::Value> {
79        match self {
80            Self::File(file_part) => serde_json::to_value(&file_part.file).ok(),
81            _ => None,
82        }
83    }
84}