callisto-cli 0.3.1

Standalone callisto CLI binary.
Documentation
use std::io::IsTerminal;
use std::process::ExitCode;

use callisto_graph::commands::InitOptions;
use dialoguer::Confirm;

use crate::cli::{GlobalArgs, InitArgs, OutputFormat};
use crate::error::CliError;
use crate::output::write_json;
use crate::render;
use crate::runner::CliCommandRunner;
use crate::workspace::load_workspace;

pub fn handle(args: InitArgs, global: &GlobalArgs) -> Result<ExitCode, CliError> {
    let runner = CliCommandRunner;
    let ws = load_workspace(global, &runner)?;

    if !args.yes && std::io::stdin().is_terminal() {
        let confirm = Confirm::new()
            .with_prompt(format!(
                "Initialize Callisto configuration in `{}`?",
                ws.root.display()
            ))
            .default(true)
            .interact()
            .map_err(|e| CliError::Other(format!("Interactive prompt failed: {e}")))?;

        if !confirm {
            println!("Initialization cancelled.");
            return Ok(ExitCode::SUCCESS);
        }
    }

    let opts = InitOptions { yes: args.yes };

    let report = callisto_graph::commands::init(&ws, &opts)?;

    match global.format {
        OutputFormat::Json => write_json(&mut std::io::stdout(), &report)?,
        OutputFormat::Text => render::render_init(&report, &mut std::io::stdout())?,
    }

    Ok(ExitCode::SUCCESS)
}