ccboard_core/models/
plan.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct PlanFile {
8 pub metadata: PlanMetadata,
10
11 pub phases: Vec<Phase>,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct PlanMetadata {
18 pub date: Option<String>,
20
21 pub last_updated: Option<String>,
23
24 pub version: Option<String>,
26
27 pub title: String,
29
30 pub status: Option<String>,
32
33 pub estimated_total_duration: Option<String>,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct Phase {
40 pub id: String,
42
43 pub title: String,
45
46 pub status: PhaseStatus,
48
49 pub tasks: Vec<Task>,
51
52 pub estimated_duration: Option<String>,
54
55 pub priority: Option<String>,
57
58 pub version_target: Option<String>,
60}
61
62#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
64pub enum PhaseStatus {
65 Complete,
67
68 InProgress,
70
71 Future,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, Default)]
77pub struct Task {
78 pub id: String,
80
81 pub title: String,
83
84 pub description: Option<String>,
86
87 pub priority: Option<String>,
89
90 pub duration: Option<String>,
92
93 pub difficulty: Option<String>,
95
96 pub crate_name: Option<String>,
98
99 pub issue: Option<u32>,
101}
102
103impl Default for PlanMetadata {
104 fn default() -> Self {
105 Self {
106 date: None,
107 last_updated: None,
108 version: None,
109 title: String::new(),
110 status: Some("future".to_string()),
111 estimated_total_duration: None,
112 }
113 }
114}
115
116impl PhaseStatus {
117 #[allow(clippy::should_implement_trait)]
119 pub fn from_str(s: &str) -> Self {
120 match s.to_lowercase().as_str() {
121 "complete" | "completed" | "done" => Self::Complete,
122 "in-progress" | "in_progress" | "active" => Self::InProgress,
123 _ => Self::Future,
124 }
125 }
126}