hpmq_cli 0.3.1

云网关命令行工具
Documentation
#![allow(unused_imports)]
use anyhow::Result;
use cargo_generate::generate;
use hpmq_cli::cli::{args::*, interactive};
use log::LevelFilter::{Debug, Info};
use log::{debug, error, info};
use oci_util::distribution::{pull::pull, push::push};
use oci_util::Reference;
use structopt::StructOpt;

use oci_util::container::init;
use oci_util::RegistryAuth;

#[tokio::main]
async fn main() -> Result<()> {
    custom_utils::logger::custom_build(Debug)
        .module("hyper", Info)
        .build_default()
        .log_to_stdout()
        .start();

    let args = Cli::from_args();
    match args {
        Cli::Init(args) => {
            let args: cargo_generate::GenerateArgs = args.to_generate_args();
            debug!("init.args: {:?}", args);
            generate(args)?;
        }
        Cli::Build(args) => {
            let build_args = args.try_into()?;
            match oci_util::image::build::build(&build_args).await {
                Err(e) => {
                    error!("build fail: {:?}", e);
                }
                Ok(digest) => {
                    info!("{}:{} build successfully", build_args.image, digest);
                }
            }
        }
        Cli::Push(args) => {
            let image = init_image(&args.image)?;
            let auth = init_auth(args.user_name, args.password);
            match push(&image, &auth).await {
                Err(e) => {
                    error!("push fail: {:?}", e);
                }
                Ok(_) => {
                    info!("{} pushed successfully", image);
                }
            }
        }
        Cli::Pull(args) => {
            let image: Reference = args.image.parse()?;
            let auth = init_auth(args.user_name, args.password);
            if let Err(e) = pull(&image, &auth).await {
                error!("pull fail: {:?}", e);
            } else {
                info!("pulled successfully ");
            }
        }
        Cli::Container(args) => {
            let image: Reference = args.image.parse()?;
            let auth = init_auth(args.user_name, args.password);
            let force = if args.force.to_uppercase().as_str() == "TRUE" {
                true
            } else {
                false
            };
            if let Err(e) = init(&image, &auth, force).await {
                error!("container init fail: {:?}", e);
            } else {
                info!("container init successfully ");
            }
        }
    }
    Ok(())
}

fn init_auth(user_name: Option<String>, password: Option<String>) -> RegistryAuth {
    let user_name = if let Some(val) = user_name {
        val
    } else {
        interactive::user_name().unwrap()
    };
    let password = if let Some(val) = password {
        val
    } else {
        interactive::password().unwrap()
    };
    RegistryAuth::Basic(user_name, password)
}