cargo-ai 0.0.11

Build lightweight AI agents with Cargo. Powered by Rust. Declared in JSON.
use std::path::PathBuf;

use crate::shipyard_ui::config;

#[derive(Clone)]
pub enum CommandIntent {
    AccountStatus,
    AccountRegister { email: String },
    AccountConfirm { code: String },
}

#[derive(Clone)]
pub struct CommandPlan {
    pub program: PathBuf,
    pub args: Vec<String>,
    pub display: String,
}

pub fn command_plan(intent: &CommandIntent) -> CommandPlan {
    match intent {
        CommandIntent::AccountStatus => account_status_plan(),
        CommandIntent::AccountRegister { email } => account_register_plan(email),
        CommandIntent::AccountConfirm { code } => account_confirm_plan(code),
    }
}

fn account_status_plan() -> CommandPlan {
    let args: Vec<String> = config::ACCOUNT_STATUS_VERBOSE_ARGS
        .iter()
        .map(|value| value.to_string())
        .collect();
    plan_with_args(args, None)
}

fn account_register_plan(email: &str) -> CommandPlan {
    let mut args: Vec<String> = config::ACCOUNT_REGISTER_VERBOSE_PREFIX_ARGS
        .iter()
        .map(|value| value.to_string())
        .collect();
    args.push(email.to_string());
    plan_with_args(args, None)
}

fn account_confirm_plan(code: &str) -> CommandPlan {
    let mut args: Vec<String> = config::ACCOUNT_CONFIRM_VERBOSE_PREFIX_ARGS
        .iter()
        .map(|value| value.to_string())
        .collect();
    args.push(code.to_string());
    plan_with_args(args, Some("<redacted-code>".to_string()))
}

fn plan_with_args(args: Vec<String>, redacted_last_arg: Option<String>) -> CommandPlan {
    if let Ok(current_exe) = std::env::current_exe() {
        let display_args = display_args(&args, redacted_last_arg);
        let display = format!("{} {}", current_exe.display(), display_args.join(" "));
        return CommandPlan {
            program: current_exe,
            args,
            display,
        };
    }

    let fallback_program = PathBuf::from("cargo-ai");
    let display_args = display_args(&args, redacted_last_arg);
    let display = format!("{} {}", fallback_program.display(), display_args.join(" "));
    CommandPlan {
        program: fallback_program,
        args,
        display,
    }
}

fn display_args(args: &[String], redacted_last_arg: Option<String>) -> Vec<String> {
    let mut values = args.to_vec();
    if let Some(replacement) = redacted_last_arg {
        if let Some(last) = values.last_mut() {
            *last = replacement;
        }
    }
    values
}