vex-cli 0.7.13

AI-native version control workflow engine
use serde_json::json;

use crate::daemon_client;

pub fn list(host: Option<&str>) {
    let mut client = daemon_client::connect_to_hub_or_exit();

    let mut params = json!({});
    if let Some(h) = host {
        params["host"] = json!(h);
    }

    match client.request("prompts.list", params) {
        Ok(result) => {
            let prompts = result.as_array().cloned().unwrap_or_default();
            if prompts.is_empty() {
                println!("No saved prompts.");
                return;
            }
            println!("{:<20} {:<30} PROMPT", "ID", "NAME");
            println!("{}", "\u{2500}".repeat(72));
            for p in &prompts {
                let id = p.get("id").and_then(|v| v.as_str()).unwrap_or("-");
                let name = p.get("name").and_then(|v| v.as_str()).unwrap_or("-");
                let prompt = p.get("prompt").and_then(|v| v.as_str()).unwrap_or("-");
                let truncated = if prompt.len() > 40 {
                    format!("{}...", &prompt[..37])
                } else {
                    prompt.to_string()
                };
                println!("{:<20} {:<30} {}", id, name, truncated);
            }
        }
        Err(e) => {
            eprintln!("Error: {e}");
            std::process::exit(1);
        }
    }
}

pub fn create(name: &str, prompt: &str, host: Option<&str>) {
    let mut client = daemon_client::connect_to_hub_or_exit();

    let mut params = json!({"name": name, "prompt": prompt});
    if let Some(h) = host {
        params["host"] = json!(h);
    }

    match client.request("prompts.create", params) {
        Ok(result) => {
            let id = result.get("id").and_then(|v| v.as_str()).unwrap_or("-");
            println!("Created prompt '{name}' (id: {id})");
        }
        Err(e) => {
            eprintln!("Error: {e}");
            std::process::exit(1);
        }
    }
}

pub fn update(id: &str, name: Option<&str>, prompt: Option<&str>, host: Option<&str>) {
    let mut client = daemon_client::connect_to_hub_or_exit();

    let mut params = json!({"id": id});
    if let Some(n) = name {
        params["name"] = json!(n);
    }
    if let Some(p) = prompt {
        params["prompt"] = json!(p);
    }
    if let Some(h) = host {
        params["host"] = json!(h);
    }

    match client.request("prompts.update", params) {
        Ok(_) => println!("Updated prompt '{id}'"),
        Err(e) => {
            eprintln!("Error: {e}");
            std::process::exit(1);
        }
    }
}

pub fn delete(id: &str, host: Option<&str>) {
    let mut client = daemon_client::connect_to_hub_or_exit();

    let mut params = json!({"id": id});
    if let Some(h) = host {
        params["host"] = json!(h);
    }

    match client.request("prompts.delete", params) {
        Ok(_) => println!("Deleted prompt '{id}'"),
        Err(e) => {
            eprintln!("Error: {e}");
            std::process::exit(1);
        }
    }
}