robotrt-cli 0.1.0-beta.2

RobotRT modular robotics runtime and middleware components.
mod commands;
mod constants;
mod demo;
mod helpers;
mod gateway;
mod usage;

use crate::helpers::is_help_token;
use crate::usage::print_usage;

fn main() {
    if let Err(err) = run() {
        eprintln!("error: {err}");
        std::process::exit(1);
    }
}

fn run() -> Result<(), String> {
    let args: Vec<String> = std::env::args().skip(1).collect();
    if args.is_empty() {
        print_usage(None);
        return Ok(());
    }

    if args.first().is_some_and(|arg| arg == "help") {
        print_usage(args.get(1).map(String::as_str));
        return Ok(());
    }

    if args.first().is_some_and(|arg| is_help_token(arg)) {
        print_usage(None);
        return Ok(());
    }

    if args.get(1).is_some_and(|arg| is_help_token(arg)) {
        print_usage(args.first().map(String::as_str));
        return Ok(());
    }

    match (
        args.first().map(String::as_str),
        args.get(1).map(String::as_str),
    ) {
        (Some("middleware"), Some("load")) => commands::middleware_load(&args[2..]),
        (Some("runtime"), Some("load")) => commands::runtime_load(&args[2..]),
        (Some("node"), Some("list")) => commands::resource_list("node", &args[2..]),
        (Some("node"), Some("info")) => commands::node_info(&args[2..]),
        (Some("topic"), Some("list")) => commands::resource_list("topic", &args[2..]),
        (Some("topic"), Some("info")) => commands::topic_info(&args[2..]),
        (Some("topic"), Some("hz")) => commands::topic_hz(&args[2..]),
        (Some("topic"), Some("echo")) => commands::topic_echo(&args[2..]),
        (Some("service"), Some("list")) => commands::resource_list("service", &args[2..]),
        (Some("service"), Some("call")) => commands::service_call(&args[2..]),
        (Some("action"), Some("list")) => commands::resource_list("action", &args[2..]),
        (Some("action"), Some("info")) => commands::action_info(&args[2..]),
        (Some("action"), Some("send")) => commands::action_send(&args[2..]),
        (Some("action"), Some("cancel")) => commands::action_cancel(&args[2..]),
        (Some("action"), Some("watch")) => commands::action_watch(&args[2..]),
        (Some("mission"), Some("list")) => commands::resource_list("mission", &args[2..]),
        (Some("mission"), Some("request")) => commands::mission_request(&args[2..]),
        (Some("mission"), Some("reply")) => commands::mission_reply(&args[2..]),
        (Some("mission"), Some("stream")) => commands::mission_stream(&args[2..]),
        (Some("mission"), Some("watch")) => commands::mission_watch(&args[2..]),
        (Some("plugin"), Some("list")) => commands::plugin_list(&args[2..]),
        (Some("obs"), Some("export")) => commands::obs_export(&args[2..]),
        (Some("orchestrate"), _) => commands::orchestrate_cmd(&args[1..]),
        (Some("ops"), Some("snapshot")) => commands::ops_snapshot(&args[2..]),
        (Some("ops"), Some("console")) => commands::ops_console(&args[2..]),
        (Some("ops"), Some("diff")) => commands::ops_diff(&args[2..]),
        (Some("ops"), Some("fleet")) => commands::ops_fleet(&args[2..]),
        (Some("ops"), Some("profile")) => commands::ops_profile(&args[2..]),
        (Some("ops"), Some("replay")) => commands::ops_replay(&args[2..]),
        (Some("sdk"), Some("init")) => commands::sdk_init(&args[2..]),
        (Some("sdk"), Some("migrate-batch")) => commands::sdk_migrate_batch(&args[2..]),
        (Some("sdk"), Some("migrate-report")) => commands::sdk_migrate_report(&args[2..]),
        (Some("sdk"), Some("retry-failed")) => commands::sdk_retry_failed(&args[2..]),
        (Some("sdk"), Some("migrate")) => commands::sdk_migrate(&args[2..]),
        (Some("sdk"), Some("rollback")) => commands::sdk_rollback(&args[2..]),
        (Some("sdk"), Some("rollback-batch")) => commands::sdk_rollback_batch(&args[2..]),
        (Some("snapshot"), Some("config")) => commands::snapshot_config(&args[2..]),
        (Some("gateway"), Some("serve")) => commands::gateway_serve(&args[2..]),
        (Some("gateway"), Some("observe")) => commands::gateway_observe(&args[2..]),
        (Some("gateway"), Some("policy-get")) => commands::gateway_policy_get(&args[2..]),
        (Some("gateway"), Some("policy-set")) => commands::gateway_policy_set(&args[2..]),
        (Some("gateway"), Some("audit")) => commands::gateway_audit_list(&args[2..]),
        (Some("gateway"), Some("shutdown")) => commands::gateway_shutdown(&args[2..]),
        (Some("health"), _) => commands::health_cmd(&args[1..]),
        (Some("graph"), _) => commands::graph_cmd(&args[1..]),
        (Some("bag"), Some("record")) => commands::bag_record(&args[2..]),
        (Some("bag"), Some("play")) => commands::bag_play(&args[2..]),
        _ => {
            print_usage(None);
            Err(String::from("unsupported command"))
        }
    }
}