crates-io-cli 4.0.3

Interact with crates.io from the command-line
use std::{error::Error, fmt, process};

struct WithCauses<'a>(&'a dyn Error);

impl<'a> fmt::Display for WithCauses<'a> {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "ERROR: {}", self.0)?;
        let mut cursor = self.0;
        while let Some(err) = cursor.source() {
            write!(f, "\ncaused by: \n{}", err)?;
            cursor = err;
        }
        write!(f, "\n")
    }
}

pub fn ok_or_exit<T, E>(result: Result<T, E>) -> T
where
    E: Error,
{
    match result {
        Ok(v) => v,
        Err(err) => {
            println!("{}", WithCauses(&err));
            process::exit(2);
        }
    }
}