use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PlanFile {
pub metadata: PlanMetadata,
pub phases: Vec<Phase>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PlanMetadata {
pub date: Option<String>,
pub last_updated: Option<String>,
pub version: Option<String>,
pub title: String,
pub status: Option<String>,
pub estimated_total_duration: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Phase {
pub id: String,
pub title: String,
pub status: PhaseStatus,
pub tasks: Vec<Task>,
pub estimated_duration: Option<String>,
pub priority: Option<String>,
pub version_target: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PhaseStatus {
Complete,
InProgress,
Future,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Task {
pub id: String,
pub title: String,
pub description: Option<String>,
pub priority: Option<String>,
pub duration: Option<String>,
pub difficulty: Option<String>,
pub crate_name: Option<String>,
pub issue: Option<u32>,
}
impl Default for PlanMetadata {
fn default() -> Self {
Self {
date: None,
last_updated: None,
version: None,
title: String::new(),
status: Some("future".to_string()),
estimated_total_duration: None,
}
}
}
impl PhaseStatus {
#[allow(clippy::should_implement_trait)]
pub fn from_str(s: &str) -> Self {
match s.to_lowercase().as_str() {
"complete" | "completed" | "done" => Self::Complete,
"in-progress" | "in_progress" | "active" => Self::InProgress,
_ => Self::Future,
}
}
}