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::process;
use std::fs::File;
use std::io::Read;
use toml::Value;

pub fn parse_arn_or_key(raw: &str) -> (String, String) {
    if raw.split(":").count() != 7 {
        if let Ok(mut lambda_toml_file) = File::open("Lambda.toml") {
            let cargo_toml: Value = {
                let mut data = String::new();
                lambda_toml_file
                    .read_to_string(&mut data)
                    .expect("Can't read ./Lambda.toml");
                toml::from_str(&data).expect("Can't parse ./Lambda.toml")
            };

            let arn = cargo_toml
                .get("arns")
                .and_then(|arns| arns.get(raw))
                .and_then(|v| v.as_str());

            if let Some(value) = arn {
                return parse_arn(value);
            }
        }
    }
    parse_arn(raw)
}

fn parse_arn(raw: &str) -> (String, String) {
    let arn: Vec<_> = raw.split(":").collect();
    if arn.len() != 7 {
        eprintln!("Unidentified ARN, should be like arn:aws:lambda:<region>:<account id>:function:<function name> or a key to Lambda.toml");
        process::exit(1);
    }

    let region = arn[3];
    let func_name = arn[6];
    (region.to_string(), func_name.to_string())
}

pub trait CommandExt {
    fn status_bool(&mut self) -> bool;
}

impl CommandExt for Command {
    fn status_bool(&mut self) -> bool {
        let result = self.status();
        result.map(|r| r.success()).unwrap_or(false)
    }
}