complior-cli 0.9.0

AI Act Compliance Scanner & Fixer — CLI
use crate::config::TuiConfig;
use super::common::ensure_engine;

pub async fn run_proxy_command(action: &crate::cli::ProxyAction, config: &TuiConfig) -> i32 {
    match action {
        crate::cli::ProxyAction::Start { command, args } => {
            run_proxy_start(command, args, config).await
        }
        crate::cli::ProxyAction::Stop => run_proxy_stop(config).await,
        crate::cli::ProxyAction::Status => run_proxy_status(config).await,
    }
}

async fn run_proxy_start(command: &str, args: &[String], config: &TuiConfig) -> i32 {
    let client = match ensure_engine(config).await {
        Ok(c) => c,
        Err(code) => return code,
    };

    let body = serde_json::json!({
        "upstream": {
            "command": command,
            "args": args,
        },
        "logCalls": true,
        "enrichPassport": true,
    });

    match client.post_json("/proxy/start", &body).await {
        Ok(result) => {
            if result.get("success").and_then(serde_json::Value::as_bool) == Some(true) {
                println!("MCP Compliance Proxy started");
                println!("  Upstream: {} {}", command, args.join(" "));
                println!("  Logging: enabled");
                0
            } else {
                let error = result.get("error").and_then(|v| v.as_str()).unwrap_or("Unknown error");
                eprintln!("Error starting proxy: {error}");
                1
            }
        }
        Err(e) => { eprintln!("Error: {e}"); 1 }
    }
}

async fn run_proxy_stop(config: &TuiConfig) -> i32 {
    let client = match ensure_engine(config).await {
        Ok(c) => c,
        Err(code) => return code,
    };

    match client.post_json("/proxy/stop", &serde_json::json!({})).await {
        Ok(result) => {
            if result.get("success").and_then(serde_json::Value::as_bool) == Some(true) {
                println!("MCP Compliance Proxy stopped");
                0
            } else {
                eprintln!("Proxy was not running");
                1
            }
        }
        Err(e) => { eprintln!("Error: {e}"); 1 }
    }
}

async fn run_proxy_status(config: &TuiConfig) -> i32 {
    let client = match ensure_engine(config).await {
        Ok(c) => c,
        Err(code) => return code,
    };

    match client.get_json("/proxy/health").await {
        Ok(result) => {
            let running = result.get("isRunning").and_then(serde_json::Value::as_bool).unwrap_or(false);
            if running {
                println!("MCP Compliance Proxy: RUNNING");
                if let Some(started) = result.get("startedAt").and_then(|v| v.as_str()) {
                    println!("  Started: {started}");
                }
                if let Some(total) = result.get("totalCalls").and_then(serde_json::Value::as_u64) {
                    println!("  Total calls: {total}");
                }
                if let Some(successful) = result.get("successfulCalls").and_then(serde_json::Value::as_u64) {
                    println!("  Successful: {successful}");
                }
                if let Some(failed) = result.get("failedCalls").and_then(serde_json::Value::as_u64) {
                    println!("  Failed: {failed}");
                }
                if let Some(tools) = result.get("uniqueTools").and_then(|v| v.as_array()) {
                    let tool_names: Vec<&str> = tools.iter().filter_map(|t| t.as_str()).collect();
                    println!("  Tools observed: {}", tool_names.join(", "));
                }
            } else {
                println!("MCP Compliance Proxy: NOT RUNNING");
            }
            0
        }
        Err(e) => { eprintln!("Error: {e}"); 1 }
    }
}