robotrt-cli 0.1.0-beta.1

RobotRT modular robotics runtime and middleware components.
use std::collections::{BTreeMap, HashMap, HashSet};
use std::fs;
use std::path::{Path, PathBuf};

use core_api::ServiceRequestId;
use core_types::{HealthStatus, MetricsProvider, MetricsSnapshot};
use introspection_core::{StatusSnapshot, read_status_snapshot};
use obs_core::{MetricsAggregator, export_otel_json_value, export_prometheus_text};
use replay_core::FileReplaySession;

use crate::constants::{DEFAULT_BAG_PATH, DEFAULT_STATUS_REPORT_PATH};
use crate::demo::capture_demo_status_report;
use crate::helpers::{has_flag, option_value, parse_report_path, parse_u64_option};
use crate::status_api::{
    STATUS_SERVICE_NAME, StatusServiceResponse, build_snapshot_request, make_udp_service_client,
    next_request_id, validate_response,
};

mod commands;
mod helpers;
mod policy;

use self::helpers::*;
use self::policy::{AlertPolicy, parse_alert_policy, parse_profile_template};

const OPS_SNAPSHOT_API_VERSION: &str = "robotrt.ops.snapshot.v1";
const OPS_CONSOLE_API_VERSION: &str = "robotrt.ops.console.v1";
const OPS_DIFF_API_VERSION: &str = "robotrt.ops.diff.v1";
const OPS_REPLAY_API_VERSION: &str = "robotrt.ops.replay.v1";
const OPS_FLEET_API_VERSION: &str = "robotrt.ops.fleet.v1";
const OPS_PROFILE_API_VERSION: &str = "robotrt.ops.profile.v1";
const DEFAULT_OPS_CONSOLE_PATH: &str = "artifacts/ops/console.html";

#[derive(Clone)]
struct OpsSource {
    label: String,
    json: serde_json::Value,
}

#[derive(Clone)]
struct OpsAlert {
    severity: String,
    component: String,
    message: String,
}

#[derive(Clone, Default)]
struct FleetTotals {
    instances: usize,
    nodes: usize,
    topics: usize,
    services: usize,
    actions: usize,
    missions: usize,
    plugins_loaded: usize,
    alerts: usize,
    healthy_instances: usize,
    degraded_instances: usize,
    unhealthy_instances: usize,
}

struct SnapshotProvider {
    status: HealthStatus,
    metrics: Vec<MetricsSnapshot>,
}

impl MetricsProvider for SnapshotProvider {
    fn collect(&self) -> Vec<MetricsSnapshot> {
        self.metrics.clone()
    }

    fn health(&self) -> HealthStatus {
        self.status.clone()
    }
}

pub fn ops_snapshot(args: &[String]) -> Result<(), String> {
    commands::ops_snapshot(args)
}

pub fn ops_console(args: &[String]) -> Result<(), String> {
    commands::ops_console(args)
}

pub fn ops_diff(args: &[String]) -> Result<(), String> {
    commands::ops_diff(args)
}

pub fn ops_replay(args: &[String]) -> Result<(), String> {
    commands::ops_replay(args)
}

pub fn ops_fleet(args: &[String]) -> Result<(), String> {
    commands::ops_fleet(args)
}

pub fn ops_profile(args: &[String]) -> Result<(), String> {
    commands::ops_profile(args)
}