Skip to main content

ito_core/
planning_init.rs

1//! Planning directory initialization.
2//!
3//! This module owns the filesystem I/O for bootstrapping the planning area.
4//! Pure helpers (path builders, templates, parsers) remain in `ito_domain::planning`.
5
6use crate::errors::{CoreError, CoreResult};
7use ito_domain::planning::{
8    milestones_dir, planning_dir, project_md_template, roadmap_md_template, state_md_template,
9};
10use std::path::Path;
11
12/// Initialize the planning directory structure under `ito_path`.
13///
14/// This is safe to call multiple times; existing files are left unchanged.
15pub fn init_planning_structure(
16    ito_path: &Path,
17    current_date: &str,
18    ito_dir: &str,
19) -> std::io::Result<()> {
20    let planning = planning_dir(ito_path);
21    std::fs::create_dir_all(&planning)?;
22    std::fs::create_dir_all(milestones_dir(ito_path))?;
23
24    let project_path = planning.join("PROJECT.md");
25    if !project_path.exists() {
26        std::fs::write(project_path, project_md_template(None, None))?;
27    }
28    let roadmap_path = planning.join("ROADMAP.md");
29    if !roadmap_path.exists() {
30        std::fs::write(roadmap_path, roadmap_md_template())?;
31    }
32    let state_path = planning.join("STATE.md");
33    if !state_path.exists() {
34        std::fs::write(state_path, state_md_template(current_date, ito_dir))?;
35    }
36    Ok(())
37}
38
39/// Read the contents of `planning/ROADMAP.md`.
40pub fn read_planning_status(ito_path: &Path) -> CoreResult<String> {
41    let roadmap_path = planning_dir(ito_path).join("ROADMAP.md");
42    ito_common::io::read_to_string(&roadmap_path)
43        .map_err(|e| CoreError::io("reading ROADMAP.md", std::io::Error::other(e)))
44}