phabricator_mock/
project.rs

1use crate::column::Column;
2use crate::phid::Phid;
3use crate::Policy;
4use crate::Space;
5use derive_builder::Builder;
6use std::sync::{Arc, Mutex};
7
8pub type Project = Arc<ProjectData>;
9
10#[derive(Debug)]
11pub struct ProjectIcon {
12    pub key: String,
13    pub name: String,
14    pub icon: String,
15}
16
17impl Default for ProjectIcon {
18    fn default() -> Self {
19        ProjectIcon {
20            key: "organization".to_string(),
21            name: "Organization".to_string(),
22            icon: "fa-building".to_string(),
23        }
24    }
25}
26
27#[derive(Debug)]
28pub struct ProjectColor {
29    pub key: String,
30    pub name: Option<String>,
31}
32
33impl Default for ProjectColor {
34    fn default() -> Self {
35        ProjectColor {
36            key: "disabled".to_string(),
37            name: None,
38        }
39    }
40}
41
42#[derive(Debug, Default)]
43pub struct ProjectPolicy {
44    pub view: Policy,
45    pub edit: Policy,
46    pub join: Policy,
47}
48
49#[derive(Builder, Debug)]
50#[builder(pattern = "owned", build_fn(name = "data_build"))]
51pub struct ProjectData {
52    pub id: u32,
53    #[builder(setter(into))]
54    pub name: String,
55    #[builder(default, setter(into))]
56    pub slug: Option<String>,
57    #[builder(default)]
58    pub description: Option<String>,
59    #[builder(default)]
60    pub icon: ProjectIcon,
61    #[builder(default)]
62    pub color: ProjectColor,
63    #[builder(default = "Phid::new_project()")]
64    pub phid: Phid,
65    #[builder(default)]
66    pub space: Option<Space>,
67    #[builder(default)]
68    pub created: u64,
69    #[builder(default)]
70    pub modified: u64,
71    #[builder(default)]
72    pub policy: ProjectPolicy,
73    #[builder(default)]
74    columns: Mutex<Vec<Column>>,
75}
76
77impl ProjectData {
78    pub fn add_column(&self, column: Column) {
79        let mut columns = self.columns.lock().unwrap();
80        columns.push(column);
81    }
82
83    pub fn columns(&self) -> Vec<Column> {
84        let columns = self.columns.lock().unwrap();
85        columns.clone()
86    }
87}
88
89impl ProjectDataBuilder {
90    pub fn build(self) -> Result<Project, String> {
91        self.data_build().map(Arc::new)
92    }
93}