manta-cli 2.0.0-beta.7

Another CLI for ALPS
//! Implements the `manta add boot-parameters` command.

use anyhow::{Context, Error};
use manta_shared::shared::dto::BootParameters;
use serde_json::Value;

use crate::cli::http_client::MantaClient;
use manta_shared::common::app_context::AppContext;

/// CLI adapter for `manta add boot-parameters`.
pub async fn exec(
  ctx: &AppContext<'_>,
  token: &str,
  cli_args: &clap::ArgMatches,
) -> Result<(), Error> {
  let hosts = cli_args
    .get_one::<String>("hosts")
    .context("'hosts' argument is mandatory")?;
  let macs: Option<String> = cli_args.get_one("macs").cloned();
  let nids: Option<String> = cli_args.get_one("nids").cloned();
  let params = cli_args
    .get_one::<String>("params")
    .context("'params' argument is mandatory")?
    .clone();
  let kernel = cli_args
    .get_one::<String>("kernel")
    .context("'kernel' argument is mandatory")?
    .clone();
  let initrd = cli_args
    .get_one::<String>("initrd")
    .context("'initrd' argument is mandatory")?
    .clone();
  let cloud_init = cli_args.get_one::<Value>("cloud-init").cloned();

  let host_vec: Vec<String> = hosts
    .split(',')
    .map(|value| value.trim().to_string())
    .collect();
  let mac_vec = macs.map(|x| {
    x.split(',')
      .map(|value| value.trim().to_string())
      .collect::<Vec<String>>()
  });
  let nid_vec: Option<Vec<u32>> = nids
    .map(|x| {
      x.split(',')
        .map(|value| {
          value.trim().parse().with_context(|| {
            format!("Could not parse NID value '{}' as a number", value.trim())
          })
        })
        .collect::<Result<Vec<u32>, _>>()
    })
    .transpose()?;

  let bp = BootParameters {
    hosts: host_vec,
    macs: mac_vec,
    nids: nid_vec,
    params,
    kernel,
    initrd,
    cloud_init,
  };

  let server_url = ctx.manta_server_url;
  MantaClient::new(server_url, ctx.site_name)?
    .add_boot_parameters(token, &bp)
    .await?;

  println!("Boot parameters created successfully");

  Ok(())
}