1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct A2ATask {
13 pub id: u64,
15
16 pub title: String,
18
19 pub description: String,
21
22 pub status: TaskStatus,
24
25 pub task_type: TaskType,
27
28 pub agent: Option<String>,
30
31 pub context_id: Option<String>,
33
34 pub priority: u8,
36
37 #[serde(default)]
39 pub retry_count: u32,
40
41 pub created_at: DateTime<Utc>,
43
44 pub updated_at: DateTime<Utc>,
46
47 pub issue_url: String,
49}
50
51#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
53#[serde(rename_all = "lowercase")]
54pub enum TaskStatus {
55 Submitted,
57 Working,
59 Completed,
61 Failed,
63 Cancelled,
65}
66
67impl TaskStatus {
68 pub fn to_label(&self) -> String {
78 format!("a2a:{}", self.to_string().to_lowercase())
79 }
80}
81
82impl std::fmt::Display for TaskStatus {
83 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84 match self {
85 TaskStatus::Submitted => write!(f, "submitted"),
86 TaskStatus::Working => write!(f, "working"),
87 TaskStatus::Completed => write!(f, "completed"),
88 TaskStatus::Failed => write!(f, "failed"),
89 TaskStatus::Cancelled => write!(f, "cancelled"),
90 }
91 }
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
96#[serde(rename_all = "lowercase")]
97pub enum TaskType {
98 CodeGeneration,
100 CodeReview,
102 Testing,
104 Deployment,
106 Documentation,
108 Analysis,
110}
111
112impl TaskType {
113 pub fn to_label(&self) -> String {
123 format!("a2a:{}", self.to_string().to_lowercase())
124 }
125}
126
127impl std::fmt::Display for TaskType {
128 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
129 match self {
130 TaskType::CodeGeneration => write!(f, "codegen"),
131 TaskType::CodeReview => write!(f, "review"),
132 TaskType::Testing => write!(f, "testing"),
133 TaskType::Deployment => write!(f, "deployment"),
134 TaskType::Documentation => write!(f, "documentation"),
135 TaskType::Analysis => write!(f, "analysis"),
136 }
137 }
138}
139
140#[cfg(test)]
141mod tests {
142 use super::*;
143
144 #[test]
145 fn test_task_status_label() {
146 assert_eq!(TaskStatus::Submitted.to_label(), "a2a:submitted");
147 assert_eq!(TaskStatus::Working.to_label(), "a2a:working");
148 assert_eq!(TaskStatus::Completed.to_label(), "a2a:completed");
149 }
150
151 #[test]
152 fn test_task_type_label() {
153 assert_eq!(TaskType::CodeGeneration.to_label(), "a2a:codegen");
154 assert_eq!(TaskType::CodeReview.to_label(), "a2a:review");
155 }
156
157 #[test]
158 fn test_task_status_display() {
159 assert_eq!(TaskStatus::Submitted.to_string(), "submitted");
160 assert_eq!(TaskStatus::Working.to_string(), "working");
161 }
162}