cnctd_cli 0.3.0

CLI for scaffolding and managing projects
use anyhow::Result;
use cnctd_xcode::XcodeProject;
use colored::Colorize;
use std::env::current_dir;

/// Discover the Xcode project from the current directory
fn discover_project() -> Result<XcodeProject> {
    let cwd = current_dir()?;
    let base_path = cwd.to_string_lossy();
    XcodeProject::discover(&base_path)
}

/// Display the current version and build number
pub async fn show_version() -> Result<()> {
    let project = discover_project()?;

    let version = project.get_version()?;
    let build = project.get_build_number()?;

    println!(
        "{} {} ({})",
        "Version:".blue(),
        version.green(),
        build.yellow()
    );
    println!(
        "  {} {}",
        "Project:".dimmed(),
        project.project_path.display()
    );
    println!("  {} {}", "Scheme:".dimmed(), project.scheme);

    Ok(())
}

/// Bump version or build number
pub async fn bump(part: &str) -> Result<()> {
    let project = discover_project()?;

    match part {
        "build" => {
            let old = project.get_build_number()?;
            let new = project.bump_build_number()?;
            println!(
                "{} build number: {} -> {}",
                "Bumped".green(),
                old.yellow(),
                new.green()
            );
        }
        "major" | "minor" | "patch" => {
            let old_version = project.get_version()?;
            let new_version = project.bump_version(part)?;
            println!(
                "{} version: {} -> {}",
                "Bumped".green(),
                old_version.yellow(),
                new_version.green()
            );
        }
        _ => {
            return Err(anyhow::anyhow!(
                "Invalid bump target '{}'. Use: build, major, minor, or patch",
                part
            ));
        }
    }

    Ok(())
}