ic-query-cli 0.22.3

Command-line wrapper for read-only Internet Computer metadata queries
Documentation
use crate::{
    nns::topology::options as topology_options,
    nns::write_text_or_json,
    nns::{
        NnsCommandError, command_cache_root, now_unix_secs, topology::options::TopologyReadOptions,
    },
};
use clap::ArgMatches;
use ic_query::nns::topology::{self, NnsTopologyHostError};
use serde::Serialize;

macro_rules! topology_read_runner {
    (
        $name:ident,
        $options:ty,
        $report:ty,
        $build:path,
        $render:path
    ) => {
        pub(in crate::nns::topology::run) fn $name(
            matches: &ArgMatches,
            network: &str,
        ) -> Result<(), NnsCommandError> {
            run_topology_read::<$options, $report>(matches, network, $build, $render)
        }
    };
}

topology_read_runner!(
    run_topology_summary,
    topology_options::TopologySummaryOptions,
    topology::NnsTopologySummaryReport,
    topology::build_nns_topology_summary_report,
    topology::nns_topology_summary_report_text
);
topology_read_runner!(
    run_topology_coverage,
    topology_options::TopologyCoverageOptions,
    topology::NnsTopologyCoverageReport,
    topology::build_nns_topology_coverage_report,
    topology::nns_topology_coverage_report_text
);
topology_read_runner!(
    run_topology_versions,
    topology_options::TopologyVersionsOptions,
    topology::NnsTopologyVersionsReport,
    topology::build_nns_topology_versions_report,
    topology::nns_topology_versions_report_text
);
topology_read_runner!(
    run_topology_health,
    topology_options::TopologyHealthOptions,
    topology::NnsTopologyHealthReport,
    topology::build_nns_topology_health_report,
    topology::nns_topology_health_report_text
);
topology_read_runner!(
    run_topology_gaps,
    topology_options::TopologyGapsOptions,
    topology::NnsTopologyGapsReport,
    topology::build_nns_topology_gaps_report,
    topology::nns_topology_gaps_report_text
);
topology_read_runner!(
    run_topology_capacity,
    topology_options::TopologyCapacityOptions,
    topology::NnsTopologyCapacityReport,
    topology::build_nns_topology_capacity_report,
    topology::nns_topology_capacity_report_text
);
topology_read_runner!(
    run_topology_regions,
    topology_options::TopologyRegionsOptions,
    topology::NnsTopologyRegionsReport,
    topology::build_nns_topology_regions_report,
    topology::nns_topology_regions_report_text
);
topology_read_runner!(
    run_topology_providers,
    topology_options::TopologyProvidersOptions,
    topology::NnsTopologyProvidersReport,
    topology::build_nns_topology_providers_report,
    topology::nns_topology_providers_report_text
);

fn run_topology_read<Options, Report>(
    matches: &ArgMatches,
    network: &str,
    build_report: fn(&topology::NnsTopologyReadRequest) -> Result<Report, NnsTopologyHostError>,
    render_text: fn(&Report) -> String,
) -> Result<(), NnsCommandError>
where
    Options: TopologyReadOptions,
    Report: Serialize,
{
    let options = Options::from_matches(matches, network);
    let format = options.format();
    let cache_root = command_cache_root()?;
    let request = options.into_request(cache_root, now_unix_secs()?);
    let report = build_report(&request)?;
    write_text_or_json(format, &report, render_text)
}