Skip to main content

a2a_rs/domain/events/
task_events.rs

1use serde::{Deserialize, Serialize};
2use serde_json::{Map, Value};
3
4use crate::domain::core::{message::Artifact, task::TaskStatus};
5
6/// Event for task status updates
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct TaskStatusUpdateEvent {
9    #[serde(rename = "taskId")]
10    pub task_id: String,
11    #[serde(rename = "contextId")]
12    pub context_id: String,
13    pub kind: String, // Always "status-update"
14    pub status: TaskStatus,
15    #[serde(skip_serializing_if = "Option::is_none")]
16    pub metadata: Option<Map<String, Value>>,
17}
18
19/// Event for task artifact updates
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct TaskArtifactUpdateEvent {
22    #[serde(rename = "taskId")]
23    pub task_id: String,
24    #[serde(rename = "contextId")]
25    pub context_id: String,
26    pub kind: String, // Always "artifact-update"
27    pub artifact: Artifact,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub append: Option<bool>,
30    #[serde(skip_serializing_if = "Option::is_none", rename = "lastChunk")]
31    pub last_chunk: Option<bool>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub metadata: Option<Map<String, Value>>,
34}
35
36impl From<crate::domain::generated::TaskStatusUpdateEvent> for TaskStatusUpdateEvent {
37    fn from(event: crate::domain::generated::TaskStatusUpdateEvent) -> Self {
38        let metadata = event.metadata.into_option().and_then(|s| {
39            if let Ok(serde_json::Value::Object(map)) = serde_json::to_value(s) {
40                Some(map)
41            } else {
42                None
43            }
44        });
45        Self {
46            task_id: event.task_id,
47            context_id: event.context_id,
48            kind: "status-update".to_string(),
49            status: event.status.into_option().unwrap_or_default(),
50            metadata,
51        }
52    }
53}
54
55impl From<crate::domain::generated::TaskArtifactUpdateEvent> for TaskArtifactUpdateEvent {
56    fn from(event: crate::domain::generated::TaskArtifactUpdateEvent) -> Self {
57        let metadata = event.metadata.into_option().and_then(|s| {
58            if let Ok(serde_json::Value::Object(map)) = serde_json::to_value(s) {
59                Some(map)
60            } else {
61                None
62            }
63        });
64        Self {
65            task_id: event.task_id,
66            context_id: event.context_id,
67            kind: "artifact-update".to_string(),
68            artifact: event.artifact.into_option().unwrap_or_default(),
69            append: Some(event.append),
70            last_chunk: Some(event.last_chunk),
71            metadata,
72        }
73    }
74}