discord-cli-rs 0.2.0

Local-first read-only Discord archival CLI — search, sync, tail, and download via a user token
//! `discord dc relationships` — show friends, blocked, pending.

use anyhow::Result;

use crate::api::Api;
use crate::commands::Ctx;
use crate::config;
use crate::output;
use crate::wire_enums::RelationshipType;

pub async fn run(ctx: &Ctx) -> Result<()> {
    let token = config::resolve_token(ctx.token_flag.as_deref())?;
    let api = Api::new(&token);

    let relationships = api.get_relationships().await?;

    if relationships.is_empty() {
        output::dim("No relationships.");
        return Ok(());
    }

    if ctx.json {
        output::print_json(&relationships);
    } else {
        let rows: Vec<Vec<String>> = relationships
            .iter()
            .map(|r| {
                let user = r.user.as_ref();
                vec![
                    user.map(|u| u.id.clone()).unwrap_or_default(),
                    user.map(|u| u.username.clone()).unwrap_or_default(),
                    user.and_then(|u| u.global_name.clone()).unwrap_or_default(),
                    RelationshipType::from(r.type_).to_string(),
                    r.nickname.clone().unwrap_or_default(),
                ]
            })
            .collect();
        output::print_table(
            &["id", "username", "display name", "type", "nickname"],
            &rows,
        );
        output::dim(&format!("\n{} relationships", relationships.len()));
    }
    Ok(())
}