selectel-mks-cli 0.1.0

CLI for the Selectel Managed Kubernetes Service.
use anyhow::{bail, Context, Result};
use selectel_mks::task;
use selectel_mks::Client;
use term_table::row::Row;
use term_table::table_cell::{Alignment, TableCell};
use term_table::{Table, TableStyle};

use crate::json;

pub(crate) fn get(client: &Client, output: &str, cluster_id: &str, task_id: &str) -> Result<()> {
    let task = client
        .get_task(cluster_id, task_id)
        .context("Failed to get cluster task")?;

    match output {
        "table" => get_print_table(&task),
        "json" => json::print_json(task)?,
        _ => bail!("Unknown output format"),
    };

    Ok(())
}

fn get_print_table(task: &task::schemas::Task) {
    let updated_at = match &task.updated_at {
        Some(time) => time.to_rfc3339(),
        None => String::new(),
    };

    let mut table = Table::new();
    table.style = TableStyle::simple();
    table.separate_rows = false;

    table.add_row(Row::new(vec![
        TableCell::new("id"),
        TableCell::new(&task.id),
    ]));
    table.add_row(Row::new(vec![
        TableCell::new("started_at"),
        TableCell::new(&task.started_at.to_rfc3339()),
    ]));
    table.add_row(Row::new(vec![
        TableCell::new("updated_at"),
        TableCell::new(updated_at),
    ]));
    table.add_row(Row::new(vec![
        TableCell::new("type"),
        TableCell::new(&task.task_type),
    ]));
    table.add_row(Row::new(vec![
        TableCell::new("status"),
        TableCell::new(&task.status),
    ]));

    println!("{}", table.render());
}

pub(crate) fn list(client: &Client, output: &str, cluster_id: &str) -> Result<()> {
    let tasks = client
        .list_tasks(cluster_id)
        .context("Failed to list cluster tasks")?;

    match output {
        "table" => list_print_table(&tasks),
        "json" => json::print_json(tasks)?,
        _ => bail!("Unknown output format"),
    };

    Ok(())
}

fn list_print_table(tasks: &[task::schemas::Task]) {
    let mut table = Table::new();
    table.style = TableStyle::simple();

    table.add_row(Row::new(vec![
        TableCell::new_with_alignment("id", 1, Alignment::Center),
        TableCell::new_with_alignment("started_at", 1, Alignment::Center),
        TableCell::new_with_alignment("updated_at", 1, Alignment::Center),
        TableCell::new_with_alignment("type", 1, Alignment::Center),
        TableCell::new_with_alignment("status", 1, Alignment::Center),
    ]));

    for task in tasks.iter() {
        let updated_at = match &task.updated_at {
            Some(time) => time.to_rfc3339(),
            None => String::new(),
        };

        table.add_row(Row::new(vec![
            TableCell::new(&task.id),
            TableCell::new(&task.started_at.to_rfc3339()),
            TableCell::new(updated_at),
            TableCell::new(&task.task_type),
            TableCell::new(&task.status),
        ]));
    }

    println!("{}", table.render());
}