phabricator_mock/
project.rs1use 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}