nils-macos-agent 0.3.0

CLI crate for nils-macos-agent in the nils-cli workspace.
Documentation
use crate::backend::process::ProcessRunner;
use crate::backend::{AutoAxBackend, AxBackendAdapter};
use crate::cli::{AxListArgs, OutputFormat};
use crate::commands::ax_common::build_target_from_args;
use crate::commands::{emit_json_success, reject_tsv_for_list_only};
use crate::error::CliError;
use crate::model::AxListRequest;
use crate::run::ActionPolicy;

pub fn run(
    format: OutputFormat,
    args: &AxListArgs,
    policy: ActionPolicy,
    runner: &dyn ProcessRunner,
) -> Result<(), CliError> {
    let target = build_target_from_args(&args.target)?;

    let request = AxListRequest {
        target,
        role: args.filters.role.clone(),
        title_contains: args.filters.title_contains.clone(),
        identifier_contains: args.filters.identifier_contains.clone(),
        value_contains: args.filters.value_contains.clone(),
        subrole: args.filters.subrole.clone(),
        focused: args.filters.focused,
        enabled: args.filters.enabled,
        max_depth: args.max_depth,
        limit: args.limit.map(|value| value as usize),
    };
    let backend = AutoAxBackend::default();
    let result = backend.list(runner, &request, policy.timeout_ms)?;

    match format {
        OutputFormat::Json => {
            emit_json_success("ax.list", result)?;
        }
        OutputFormat::Text => {
            if result.nodes.is_empty() {
                println!("ax.list\tnodes=0");
            } else {
                for node in result.nodes {
                    println!(
                        "ax.list\tnode_id={}\trole={}\ttitle={}\tactions={}",
                        node.node_id,
                        node.role,
                        node.title.unwrap_or_default(),
                        node.actions.join(","),
                    );
                }
            }
        }
        OutputFormat::Tsv => {
            return reject_tsv_for_list_only();
        }
    }

    Ok(())
}