robotrt-cli 0.1.0-beta.1

RobotRT modular robotics runtime and middleware components.
use super::*;

pub(super) fn obs_export(args: &[String]) -> Result<(), String> {
    let format = option_value(args, "--format").unwrap_or_else(|| "prometheus".to_string());
    if format != "prometheus" && format != "otel" {
        return Err(format!(
            "unsupported --format value: {format} (expected prometheus|otel)"
        ));
    }

    let alert_template =
        option_value(args, "--alert-template").unwrap_or_else(|| "none".to_string());
    if alert_template != "none" && alert_template != "basic" {
        return Err(format!(
            "unsupported --alert-template value: {alert_template} (expected none|basic)"
        ));
    }

    let json = has_flag(args, "--json");
    let (snapshot, source) = data_source::load_status_snapshot(args)?;
    let aggregator = metrics::build_snapshot_aggregator(&snapshot);

    let metrics_payload = if format == "prometheus" {
        serde_json::Value::String(export_prometheus_text(&aggregator))
    } else {
        export_otel_json_value(&aggregator)
    };

    let template_payload = metrics::build_alert_template(&alert_template);

    if json {
        let payload = serde_json::json!({
            "api_version": OBS_EXPORT_API_VERSION,
            "kind": "obs_export",
            "captured_at_unix_nanos": snapshot.captured_at_unix_nanos,
            "source": source.json,
            "query": {
                "format": format,
                "alert_template": alert_template,
            },
            "result": {
                "metrics": metrics_payload,
                "alert_template": template_payload,
            }
        });
        println!(
            "{}",
            serde_json::to_string_pretty(&payload)
                .map_err(|err| format!("serialize obs export payload failed: {err}"))?
        );
    } else {
        println!("RobotRT Obs Export");
        println!("source: {}", source.label);
        println!("format: {}", format);
        println!();

        if format == "prometheus" {
            println!(
                "{}",
                metrics_payload
                    .as_str()
                    .ok_or_else(|| String::from("unexpected prometheus payload type"))?
            );
        } else {
            println!(
                "{}",
                serde_json::to_string_pretty(&metrics_payload)
                    .map_err(|err| format!("serialize otel payload failed: {err}"))?
            );
        }

        if !template_payload.is_null() {
            println!();
            println!("alert_template:");
            println!(
                "{}",
                template_payload
                    .as_str()
                    .ok_or_else(|| String::from("unexpected alert template payload type"))?
            );
        }
    }

    Ok(())
}