Skip to main content

routa_core/models/
artifact.rs

1use 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}