everruns_core/
workspace.rs1use chrono::{DateTime, Utc};
11use serde::{Deserialize, Serialize};
12use uuid::Uuid;
13
14use crate::typed_id::WorkspaceId;
15
16#[cfg(feature = "openapi")]
17use utoipa::ToSchema;
18
19#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
28#[cfg_attr(feature = "openapi", derive(ToSchema))]
29#[serde(rename_all = "lowercase")]
30pub enum WorkspaceStatus {
31 Active,
32 Archived,
33 Deleted,
34}
35
36impl std::fmt::Display for WorkspaceStatus {
37 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
38 match self {
39 WorkspaceStatus::Active => write!(f, "active"),
40 WorkspaceStatus::Archived => write!(f, "archived"),
41 WorkspaceStatus::Deleted => write!(f, "deleted"),
42 }
43 }
44}
45
46impl From<&str> for WorkspaceStatus {
47 fn from(s: &str) -> Self {
48 match s {
49 "archived" => WorkspaceStatus::Archived,
50 "deleted" => WorkspaceStatus::Deleted,
51 _ => WorkspaceStatus::Active,
52 }
53 }
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
58#[cfg_attr(feature = "openapi", derive(ToSchema))]
59pub struct Workspace {
60 #[serde(rename = "id")]
62 #[cfg_attr(
63 feature = "openapi",
64 schema(value_type = String, example = "wsp_01933b5a000070008000000000000001")
65 )]
66 pub public_id: WorkspaceId,
67 #[serde(skip, default = "Uuid::nil")]
69 pub internal_id: Uuid,
70 pub name: String,
72 #[serde(skip_serializing_if = "Option::is_none")]
74 pub description: Option<String>,
75 #[serde(default, skip_serializing_if = "Option::is_none")]
77 pub owner_principal_id: Option<String>,
78 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub resolved_owner_user_id: Option<Uuid>,
81 pub status: WorkspaceStatus,
83 pub created_at: DateTime<Utc>,
84 pub updated_at: DateTime<Utc>,
85 #[serde(skip_serializing_if = "Option::is_none")]
86 pub archived_at: Option<DateTime<Utc>>,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub deleted_at: Option<DateTime<Utc>>,
89}