phabricator_mock/
task.rs

1use crate::phid::Phid;
2use crate::Column;
3use crate::Policy;
4use crate::Priority;
5use crate::Project;
6use crate::Space;
7use crate::Status;
8use crate::User;
9use derive_builder::Builder;
10use rust_decimal::prelude::*;
11
12use std::sync::Mutex;
13use std::sync::{Arc, Weak};
14
15#[derive(Clone, Debug, Default)]
16pub struct TaskPolicy {
17    pub view: Policy,
18    pub interact: Policy,
19    pub edit: Policy,
20}
21
22pub type Task = Arc<TaskData>;
23
24#[derive(Builder)]
25#[builder(pattern = "owned", build_fn(name = "data_build"), setter(strip_option))]
26pub struct TaskData {
27    pub id: u32,
28    #[builder(setter(into))]
29    pub full_name: String,
30    #[builder(default = "Phid::new_task()")]
31    pub phid: Phid,
32    #[builder(setter(into))]
33    pub description: String,
34    pub author: User,
35    #[builder(default)]
36    pub owner: Option<User>,
37    pub priority: Priority,
38    #[builder(default)]
39    pub points: Option<Decimal>,
40    #[builder(default)]
41    pub closer: Option<User>,
42    pub status: Status,
43    #[builder(default)]
44    pub date_created: u64,
45    #[builder(default)]
46    pub date_modified: u64,
47    #[builder(default)]
48    pub date_closed: Option<u64>,
49    #[builder(default)]
50    pub space: Option<Space>,
51    #[builder(default)]
52    pub policy: TaskPolicy,
53    #[builder(default)]
54    pub projects: Vec<Project>,
55    #[builder(default)]
56    pub columns: Vec<Column>,
57    #[builder(default)]
58    pub subscribers: Vec<User>,
59    #[builder(default)]
60    parents: Mutex<Vec<Weak<TaskData>>>,
61    #[builder(default)]
62    subtasks: Mutex<Vec<Task>>,
63}
64
65impl TaskDataBuilder {
66    pub fn build(self) -> Result<Task, String> {
67        self.data_build().map(Arc::new)
68    }
69}
70
71impl TaskData {
72    pub fn parents(&self) -> Vec<Task> {
73        let parents = self.parents.lock().unwrap();
74        parents.iter().map(|t| t.upgrade().unwrap()).collect()
75    }
76
77    pub fn subtasks(&self) -> Vec<Task> {
78        let subtasks = self.subtasks.lock().unwrap();
79        subtasks.clone()
80    }
81}
82
83pub fn link(parent: &Task, subtask: &Task) {
84    let mut p = parent.subtasks.lock().unwrap();
85    p.push(subtask.clone());
86
87    let mut s = subtask.parents.lock().unwrap();
88    s.push(Arc::downgrade(parent));
89}