liber-cli 0.1.0

AI-agent-readable company directory CLI
//! `liber chats …` verbs.

use std::path::Path;

use serde_json::{json, Value};

use crate::data;
use crate::output::{emit, CliError, Ctx};

pub fn list(dir: &Path, ctx: Ctx) -> Result<(), CliError> {
    let data = data::load(dir, "chats")?;
    let map = data
        .get("group_chats")
        .cloned()
        .unwrap_or(Value::Object(Default::default()));
    emit(ctx, &map);
    Ok(())
}

pub fn get(dir: &Path, ctx: Ctx, name: &str) -> Result<(), CliError> {
    let data = data::load(dir, "chats")?;
    let platform_default = data.get("platform").and_then(|v| v.as_str()).map(String::from);
    let map = data
        .get("group_chats")
        .and_then(|v| v.as_object())
        .cloned()
        .unwrap_or_default();
    let val = map.get(name).ok_or_else(|| {
        CliError::not_found(
            format!("chat not found: {name}"),
            Some("try `liber chats list` for exact names".into()),
        )
    })?;
    let (id, platform) = match val {
        Value::String(s) => (Value::String(s.clone()), platform_default.clone()),
        Value::Object(o) => (
            o.get("id").cloned().unwrap_or(Value::Null),
            o.get("platform")
                .and_then(|v| v.as_str())
                .map(String::from)
                .or(platform_default.clone()),
        ),
        other => (other.clone(), platform_default.clone()),
    };
    let mut out = json!({ "name": name, "id": id });
    if let Some(p) = platform {
        out.as_object_mut().unwrap().insert("platform".into(), Value::String(p));
    }
    emit(ctx, &out);
    Ok(())
}