Skip to main content

systemprompt_models/a2a/
task.rs

1use super::artifact::Artifact;
2use super::message::Message;
3use super::task_metadata::TaskMetadata;
4use serde::{Deserialize, Serialize};
5use systemprompt_identifiers::{ContextId, TaskId};
6
7#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
8pub struct Task {
9    pub id: TaskId,
10    #[serde(rename = "contextId")]
11    pub context_id: ContextId,
12    pub status: TaskStatus,
13    pub history: Option<Vec<Message>>,
14    pub artifacts: Option<Vec<Artifact>>,
15    pub metadata: Option<TaskMetadata>,
16    #[serde(rename = "kind")]
17    pub kind: String,
18}
19
20impl Default for Task {
21    fn default() -> Self {
22        Self {
23            id: TaskId::generate(),
24            context_id: ContextId::generate(),
25            status: TaskStatus::default(),
26            history: None,
27            artifacts: None,
28            metadata: None,
29            kind: "task".to_string(),
30        }
31    }
32}
33
34#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
35pub struct TaskStatus {
36    pub state: TaskState,
37    pub message: Option<Message>,
38    pub timestamp: Option<chrono::DateTime<chrono::Utc>>,
39}
40
41impl Default for TaskStatus {
42    fn default() -> Self {
43        Self {
44            state: TaskState::Submitted,
45            message: None,
46            timestamp: None,
47        }
48    }
49}
50
51#[derive(Debug, Serialize, Deserialize, Clone, Copy, PartialEq, Eq)]
52pub enum TaskState {
53    #[serde(rename = "pending")]
54    Pending,
55    #[serde(rename = "submitted")]
56    Submitted,
57    #[serde(rename = "working")]
58    Working,
59    #[serde(rename = "completed")]
60    Completed,
61    #[serde(rename = "failed")]
62    Failed,
63    #[serde(rename = "canceled")]
64    Canceled,
65    #[serde(rename = "rejected")]
66    Rejected,
67    #[serde(rename = "input-required")]
68    InputRequired,
69    #[serde(rename = "auth-required")]
70    AuthRequired,
71    #[serde(rename = "unknown")]
72    Unknown,
73}
74
75impl std::str::FromStr for TaskState {
76    type Err = String;
77
78    fn from_str(s: &str) -> Result<Self, Self::Err> {
79        match s {
80            "pending" => Ok(Self::Pending),
81            "submitted" => Ok(Self::Submitted),
82            "working" => Ok(Self::Working),
83            "completed" => Ok(Self::Completed),
84            "failed" => Ok(Self::Failed),
85            "canceled" => Ok(Self::Canceled),
86            "rejected" => Ok(Self::Rejected),
87            "input-required" => Ok(Self::InputRequired),
88            "auth-required" => Ok(Self::AuthRequired),
89            "unknown" => Ok(Self::Unknown),
90            _ => Err(format!("Invalid task state: {s}")),
91        }
92    }
93}