#![cfg_attr(coverage_nightly, coverage(off))]
use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Roadmap {
pub version: String,
pub sprints: Vec<Sprint>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Sprint {
pub number: u32,
pub name: String,
pub focus: String,
pub status: SprintStatus,
pub duration: String,
pub tickets: Vec<Ticket>,
pub quality_gates: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SprintStatus {
Complete,
InProgress,
Planned,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Ticket {
pub id: String,
pub description: String,
pub completed: bool,
pub commit: Option<String>,
}
#[derive(Debug, thiserror::Error)]
pub enum RoadmapError {
#[error("Failed to read roadmap file: {0}")]
IoError(#[from] std::io::Error),
#[error("Invalid roadmap format: {0}")]
ParseError(String),
#[error("Invalid ticket ID format: {0}")]
InvalidTicketId(String),
#[error("Sprint {0} has no tickets")]
EmptySprint(u32),
}
pub type Result<T> = std::result::Result<T, RoadmapError>;
include!("roadmap_impl.rs");
include!("roadmap_parsing.rs");
include!("roadmap_tests.rs");