greentic-dev 0.5.4

Developer CLI and local tooling for Greentic flows, packs, and components
Documentation
use std::fs;
use std::path::{Path, PathBuf};
use std::time::{SystemTime, UNIX_EPOCH};

use anyhow::{Context, Result};

use crate::wizard::plan::{WizardAnswers, WizardPlan};

pub struct PersistedPaths {
    pub answers_path: PathBuf,
    pub plan_path: PathBuf,
    pub exec_log_path: PathBuf,
    pub delegated_answers_path: PathBuf,
}

pub fn resolve_out_dir(out: Option<&Path>) -> PathBuf {
    if let Some(path) = out {
        return path.to_path_buf();
    }
    let run_id = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .map(|d| format!("run-{}", d.as_secs()))
        .unwrap_or_else(|_| "run-unknown".to_string());
    PathBuf::from(".greentic").join("wizard").join(run_id)
}

pub fn prepare_dir(root: &Path) -> Result<PersistedPaths> {
    fs::create_dir_all(root).with_context(|| format!("failed to create {}", root.display()))?;
    Ok(PersistedPaths {
        answers_path: root.join("answers.json"),
        plan_path: root.join("plan.json"),
        exec_log_path: root.join("exec.log"),
        delegated_answers_path: root.join("delegated-answers.json"),
    })
}

pub fn persist_plan_and_answers(
    paths: &PersistedPaths,
    answers: &WizardAnswers,
    plan: &WizardPlan,
) -> Result<()> {
    let answers_json =
        serde_json::to_string_pretty(&answers.data).context("render answers JSON")?;
    fs::write(&paths.answers_path, answers_json)
        .with_context(|| format!("failed to write {}", paths.answers_path.display()))?;

    let plan_json = serde_json::to_string_pretty(plan).context("render plan JSON")?;
    fs::write(&paths.plan_path, plan_json)
        .with_context(|| format!("failed to write {}", paths.plan_path.display()))?;
    Ok(())
}

pub fn persist_delegated_answers(path: &Path, delegated_answers: &serde_json::Value) -> Result<()> {
    let answers_json =
        serde_json::to_string_pretty(delegated_answers).context("render delegated answers JSON")?;
    fs::write(path, answers_json).with_context(|| format!("failed to write {}", path.display()))?;
    Ok(())
}