dirge-agent 0.10.2

Minimalistic coding agent written in Rust, optimized for memory footprint and performance
//! /tree handler.

use crate::ui::events::render_session;
use crate::ui::slash::{SlashCtx, c_agent, c_error, c_result};
use crate::ui::tree::{self, short_id};

pub(crate) async fn cmd_tree(ctx: &mut SlashCtx<'_>, parts: &[&str]) -> anyhow::Result<()> {
    ctx.session.ensure_tree_initialized();
    ctx.session.ensure_message_store_initialized();

    let arg = parts.get(1).copied().unwrap_or("").trim();
    if arg.is_empty() {
        if ctx.session.tree.entries.is_empty() {
            ctx.renderer.write_line("(empty session)", c_agent())?;
        } else {
            for line in tree::render_tree(ctx.session) {
                ctx.renderer.write_line(&line, c_result())?;
            }
        }
    } else {
        match tree::resolve_id_prefix(ctx.session, arg) {
            Ok(id) => {
                if let Err(e) = ctx.session.switch_to_leaf(&id) {
                    ctx.renderer
                        .write_line(&format!("switch failed: {}", e), c_error())?;
                } else {
                    render_session(ctx.renderer, ctx.session, ctx.cli, ctx.cfg, ctx.context)?;
                    ctx.renderer
                        .write_line(&format!("switched to leaf {}", short_id(&id)), c_agent())?;
                }
            }
            Err(e) => ctx
                .renderer
                .write_line(&format!("/tree: {}", e), c_error())?,
        }
    }
    Ok(())
}