routa_core/models/
artifact.rs1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use std::collections::BTreeMap;
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
6pub enum ArtifactType {
7 #[serde(rename = "screenshot")]
8 Screenshot,
9 #[serde(rename = "test_results")]
10 TestResults,
11 #[serde(rename = "code_diff")]
12 CodeDiff,
13 #[serde(rename = "logs")]
14 Logs,
15}
16
17impl ArtifactType {
18 pub fn as_str(&self) -> &'static str {
19 match self {
20 Self::Screenshot => "screenshot",
21 Self::TestResults => "test_results",
22 Self::CodeDiff => "code_diff",
23 Self::Logs => "logs",
24 }
25 }
26
27 #[allow(clippy::should_implement_trait)]
28 pub fn from_str(value: &str) -> Option<Self> {
29 match value {
30 "screenshot" => Some(Self::Screenshot),
31 "test_results" => Some(Self::TestResults),
32 "code_diff" => Some(Self::CodeDiff),
33 "logs" => Some(Self::Logs),
34 _ => None,
35 }
36 }
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
40pub enum ArtifactStatus {
41 #[serde(rename = "pending")]
42 Pending,
43 #[serde(rename = "provided")]
44 Provided,
45 #[serde(rename = "expired")]
46 Expired,
47}
48
49impl ArtifactStatus {
50 pub fn as_str(&self) -> &'static str {
51 match self {
52 Self::Pending => "pending",
53 Self::Provided => "provided",
54 Self::Expired => "expired",
55 }
56 }
57
58 #[allow(clippy::should_implement_trait)]
59 pub fn from_str(value: &str) -> Option<Self> {
60 match value {
61 "pending" => Some(Self::Pending),
62 "provided" => Some(Self::Provided),
63 "expired" => Some(Self::Expired),
64 _ => None,
65 }
66 }
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
70#[serde(rename_all = "camelCase")]
71pub struct Artifact {
72 pub id: String,
73 #[serde(rename = "type")]
74 pub artifact_type: ArtifactType,
75 pub task_id: String,
76 pub workspace_id: String,
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub provided_by_agent_id: Option<String>,
79 #[serde(skip_serializing_if = "Option::is_none")]
80 pub requested_by_agent_id: Option<String>,
81 #[serde(skip_serializing_if = "Option::is_none")]
82 pub request_id: Option<String>,
83 #[serde(skip_serializing_if = "Option::is_none")]
84 pub content: Option<String>,
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub context: Option<String>,
87 pub status: ArtifactStatus,
88 #[serde(skip_serializing_if = "Option::is_none")]
89 pub expires_at: Option<DateTime<Utc>>,
90 #[serde(skip_serializing_if = "Option::is_none")]
91 pub metadata: Option<BTreeMap<String, String>>,
92 pub created_at: DateTime<Utc>,
93 pub updated_at: DateTime<Utc>,
94}