1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use crate::column::Column;
use crate::phid::Phid;
use crate::Policy;
use crate::Space;
use derive_builder::Builder;
use std::sync::{Arc, Mutex};

pub type Project = Arc<ProjectData>;

#[derive(Debug)]
pub struct ProjectIcon {
    pub key: String,
    pub name: String,
    pub icon: String,
}

impl Default for ProjectIcon {
    fn default() -> Self {
        ProjectIcon {
            key: "organization".to_string(),
            name: "Organization".to_string(),
            icon: "fa-building".to_string(),
        }
    }
}

#[derive(Debug)]
pub struct ProjectColor {
    pub key: String,
    pub name: Option<String>,
}

impl Default for ProjectColor {
    fn default() -> Self {
        ProjectColor {
            key: "disabled".to_string(),
            name: None,
        }
    }
}

#[derive(Debug, Default)]
pub struct ProjectPolicy {
    pub view: Policy,
    pub edit: Policy,
    pub join: Policy,
}

#[derive(Builder, Debug)]
#[builder(pattern = "owned", build_fn(name = "data_build"))]
pub struct ProjectData {
    pub id: u32,
    #[builder(setter(into))]
    pub name: String,
    #[builder(default, setter(into))]
    pub slug: Option<String>,
    #[builder(default)]
    pub description: Option<String>,
    #[builder(default)]
    pub icon: ProjectIcon,
    #[builder(default)]
    pub color: ProjectColor,
    #[builder(default = "Phid::new_project()")]
    pub phid: Phid,
    #[builder(default)]
    pub space: Option<Space>,
    #[builder(default)]
    pub created: u64,
    #[builder(default)]
    pub modified: u64,
    #[builder(default)]
    pub policy: ProjectPolicy,
    #[builder(default)]
    columns: Mutex<Vec<Column>>,
}

impl ProjectData {
    pub fn add_column(&self, column: Column) {
        let mut columns = self.columns.lock().unwrap();
        columns.push(column);
    }

    pub fn columns(&self) -> Vec<Column> {
        let columns = self.columns.lock().unwrap();
        columns.clone()
    }
}

impl ProjectDataBuilder {
    pub fn build(self) -> Result<Project, String> {
        self.data_build().map(Arc::new)
    }
}