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}