autoagents_core/agent/
task.rs1#[cfg(not(target_arch = "wasm32"))]
2use crate::actor::{ActorMessage, CloneableMessage};
3use crate::protocol::SubmissionId;
4use autoagents_llm::chat::ImageMime;
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7use uuid::Uuid;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct Task {
11 pub prompt: String,
12 pub image: Option<(ImageMime, Vec<u8>)>,
13 pub submission_id: SubmissionId,
14 pub completed: bool,
15 pub result: Option<Value>,
16}
17
18impl Task {
19 pub fn new<T: Into<String>>(task: T) -> Self {
20 Self {
21 prompt: task.into(),
22 image: None,
23 submission_id: Uuid::new_v4(),
24 completed: false,
25 result: None,
26 }
27 }
28
29 pub fn new_with_image<T: Into<String>>(
30 task: T,
31 image_mime: ImageMime,
32 image_data: Vec<u8>,
33 ) -> Self {
34 Self {
35 prompt: task.into(),
36 image: Some((image_mime, image_data)),
37 submission_id: Uuid::new_v4(),
38 completed: false,
39 result: None,
40 }
41 }
42}
43
44#[cfg(not(target_arch = "wasm32"))]
45impl ActorMessage for Task {}
46#[cfg(not(target_arch = "wasm32"))]
47impl CloneableMessage for Task {}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52 use serde_json::json;
53
54 #[test]
55 fn test_task_creation() {
56 let task = Task::new("Test task");
57
58 assert_eq!(task.prompt, "Test task");
59 assert!(!task.completed);
60 assert!(task.result.is_none());
61 assert!(!task.submission_id.is_nil());
62 }
63
64 #[test]
65 fn test_task_creation_with_string() {
66 let task_str = "Another test task".to_string();
67 let task = Task::new(task_str);
68
69 assert_eq!(task.prompt, "Another test task");
70 }
71
72 #[test]
73 fn test_task_serialization() {
74 let task = Task::new("Serialize me");
75
76 let serialized = serde_json::to_string(&task).unwrap();
78 assert!(serialized.contains("Serialize me"));
79 assert!(serialized.contains("submission_id"));
80 assert!(serialized.contains("completed"));
81
82 let deserialized: Task = serde_json::from_str(&serialized).unwrap();
84 assert_eq!(deserialized.prompt, task.prompt);
85 assert_eq!(deserialized.submission_id, task.submission_id);
86 assert_eq!(deserialized.completed, task.completed);
87 }
88
89 #[test]
90 fn test_task_with_result() {
91 let mut task = Task::new("Task with result");
92 let result_value = json!({"output": "success", "value": 42});
93 task.result = Some(result_value.clone());
94 task.completed = true;
95
96 assert!(task.completed);
97 assert_eq!(task.result, Some(result_value));
98 }
99
100 #[test]
101 fn test_task_unique_submission_ids() {
102 let task1 = Task::new("Task 1");
103 let task2 = Task::new("Task 2");
104
105 assert_ne!(task1.submission_id, task2.submission_id);
106 }
107
108 #[test]
109 fn test_task_clone() {
110 let original = Task::new("Original task");
111 let cloned = original.clone();
112
113 assert_eq!(original.prompt, cloned.prompt);
114 assert_eq!(original.submission_id, cloned.submission_id);
115 assert_eq!(original.completed, cloned.completed);
116 assert_eq!(original.result, cloned.result);
117 }
118
119 #[test]
120 fn test_task_debug() {
121 let task = Task::new("Debug test");
122 let debug_str = format!("{task:?}");
123
124 assert!(debug_str.contains("Task"));
125 assert!(debug_str.contains("Debug test"));
126 }
127
128 #[test]
129 fn test_task_with_image() {
130 let image_data = vec![0x89, 0x50, 0x4E, 0x47]; let task = Task::new_with_image("Task with image", ImageMime::PNG, image_data.clone());
132
133 assert_eq!(task.prompt, "Task with image");
134 assert!(task.image.is_some());
135 if let Some((mime, data)) = &task.image {
136 assert_eq!(*mime, ImageMime::PNG);
137 assert_eq!(*data, image_data);
138 }
139 assert!(!task.completed);
140 assert!(task.result.is_none());
141 }
142
143 #[test]
144 fn test_task_without_image() {
145 let task = Task::new("Task without image");
146
147 assert_eq!(task.prompt, "Task without image");
148 assert!(task.image.is_none());
149 assert!(!task.completed);
150 assert!(task.result.is_none());
151 }
152
153 #[test]
154 fn test_task_image_serialization() {
155 let image_data = vec![0xFF, 0xD8, 0xFF, 0xE0]; let task = Task::new_with_image("Serialize with image", ImageMime::JPEG, image_data);
157
158 let serialized = serde_json::to_string(&task).unwrap();
160 assert!(serialized.contains("Serialize with image"));
161 assert!(serialized.contains("image"));
162
163 let deserialized: Task = serde_json::from_str(&serialized).unwrap();
165 assert_eq!(deserialized.prompt, task.prompt);
166 assert_eq!(deserialized.image, task.image);
167 assert_eq!(deserialized.submission_id, task.submission_id);
168 }
169}