cargo-aws-lambda 0.3.0

Cross-compile, package and deploy AWS Lambda functions with only docker as a dependency using cargo aws-lambda.
use std::process::Command;
use std::ffi::OsStr;
use std::path::Path;
use crate::Opt;
use crate::util::CommandExt;
use std::process;

pub(crate) fn build_args(project_dir: &Path, cargo_registry: &Path, opt: &Opt) -> Vec<String> {
    let mut args: Vec<String> = vec![
        "run".into(),
        "--rm".into(),
        "-v".into(),
        format!("{}:/code", project_dir.display()),
    ];

    if opt.use_build_volume {
        args.push("-v".into());
        args.push(format!("{}:/build-volume", build_volume_name()));
        args.push("-v".into());
        args.push(format!("{}:/root/.cargo/registry", build_volume_name()));
    } else {
        args.push("-v".into());
        args.push(format!(
            "{}:/root/.cargo/registry",
            cargo_registry.display()
        ));
    }

    if opt.keep_debug_info {
        args.push("-e".into());
        args.push("DEBUGINFO=1".into());
    }

    for env in &opt.env {
        args.push("-e".into());
        args.push(env.clone());
    }

    args.push(opt.docker_image.clone());
    args
}

pub fn manage_build_volume() {
    let name = build_volume_name();

    let success = Command::new("docker")
        .args(&["volume", "inspect", &name])
        .status_bool();

    if !success {
        println!("Didn't find build volume {}, creating it", name);
    } else {
        return;
    }

    let success = Command::new("docker")
        .args(&["volume", "create", &name])
        .status_bool();

    if !success {
        eprintln!("Failed to create docker build volume {}", name);
        ::std::process::exit(1);
    } else {
        println!("Created docker volume {}", name)
    }
}

pub fn check() {
    let result = Command::new("docker").args(&["--version"]).output();
    match result {
        Ok(ref output) if output.status.success() => {}
        e => {
            eprintln!(
                "Docker missing, executing docker --version failed with {:?}",
                e
            );
            process::exit(1);
        }
    }
}

fn build_volume_name() -> String {
    let cwd = std::env::current_dir().expect("Can't get cwd");
    let basename = cwd
        .file_name()
        .and_then(OsStr::to_str)
        .expect("Can't get basename from cwd");
    format!("rust-build-volume-{}", basename)
}