otoroshictl 0.0.17

a CLI to manage your otoroshi clusters with style ;)
use cli_table::{Cell, Style, Table, print_stdout};
use serde::{Deserialize, Serialize};

use crate::cli::cliopts::{CliOpts, Commands};
use crate::utils::otoroshi::Otoroshi;
use crate::{cli_stderr_printline, cli_stdout_printline};

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct OtoroshExposedResourceVersion {
    pub name: String,
    pub served: bool,
    pub deprecated: bool,
    pub storage: bool,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct OtoroshExposedResource {
    pub kind: String,
    pub plural_name: String,
    pub singular_name: String,
    pub group: String,
    pub version: OtoroshExposedResourceVersion,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct OtoroshExposedResources {
    pub version: String,
    pub resources: Vec<OtoroshExposedResource>,
}

pub struct EntitiesCommand {}

impl EntitiesCommand {
    fn default_display(resources: OtoroshExposedResources) {
        let table = resources
            .resources
            .into_iter()
            .map(|item| {
                vec![
                    item.kind.cell(),
                    item.singular_name.cell(),
                    item.plural_name.cell(),
                    item.group.cell(),
                    item.version.name.cell(),
                    item.version.served.cell(),
                    item.version.deprecated.cell(),
                    item.version.storage.cell(),
                ]
            })
            .table()
            .title(vec![
                "kind".cell().bold(true),
                "singular_name".cell().bold(true),
                "plural_name".cell().bold(true),
                "group".cell().bold(true),
                "version".cell().bold(true),
                "served".cell().bold(true),
                "deprecated".cell().bold(true),
                "storage".cell().bold(true),
            ]);
        let _ = print_stdout(table);
    }

    pub async fn display(cli_opts: CliOpts, _command: &Commands) {
        match Otoroshi::get_exposed_resources(cli_opts.clone()).await {
            None => {
                cli_stderr_printline!("error while fetching exposed resources");
                std::process::exit(-1)
            }
            Some(resources) => {
                match cli_opts.ouput {
                    Some(str) => match str.as_str() {
                        "json" => {
                            cli_stdout_printline!("{}", serde_json::to_string(&resources).unwrap())
                        }
                        "json_pretty" => cli_stdout_printline!(
                            "{}",
                            serde_json::to_string_pretty(&resources).unwrap()
                        ),
                        "yaml" => {
                            cli_stdout_printline!("{}", serde_yaml::to_string(&resources).unwrap())
                        }
                        _ => Self::default_display(resources),
                    },
                    _ => Self::default_display(resources),
                };
            }
        };
    }
}