stackenv 0.1.4

Native, zero-container multi-project dev environment manager. No Docker, no VMs.

use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;

#[derive(Debug, Default, Serialize, Deserialize)]
pub struct ProjectsFile {
    #[serde(default)]
    pub projects: BTreeMap<String, ProjectRecord>,
}

#[derive(Debug, Default, Serialize, Deserialize)]
pub struct ProjectRecord {
    #[serde(default)]
    pub languages: Vec<(String, String)>,
    #[serde(default)]
    pub services: Vec<(String, String)>,
}

impl ProjectsFile {
    pub fn projects_path() -> PathBuf {
        let base = dirs::home_dir().expect("could not resolve home directory");
        base.join(".stack").join("projects.json")
    }

    pub fn load() -> Self {
        let path = Self::projects_path();
        match std::fs::read_to_string(&path) {
            Ok(text) => serde_json::from_str(&text).unwrap_or_default(),
            Err(_) => Self::default(),
        }
    }

    pub fn save(&self) -> std::io::Result<()> {
        let path = Self::projects_path();
        if let Some(parent) = path.parent() {
            std::fs::create_dir_all(parent)?;
        }
        let text = serde_json::to_string_pretty(self).expect("projects file serializes");
        std::fs::write(path, text)
    }
}