narrate 0.4.2

narrate is a set of CLI app utilities for error handling and status reporting
Documentation
use std::fmt;

use crate::{CliError, ExitCode};

impl std::error::Error for CliError {}

impl fmt::Display for CliError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        use CliError::*;
        match self {
            Config => write!(f, "invalid configuration"),

            CreateFile(file) => write!(f, "cannot create file: {}", file.display()),

            InputData => write!(f, "invalid input data"),

            InputFileNotFound(file) => write!(f, "file not found: {}", file.display()),

            NoUser(user) => write!(f, "user not found: {}", user),

            NoHost(host) => write!(f, "host not found: {}", host),

            OperationPermission(op) => write!(f, "no permission for operation: {}", op),

            OsErr => write!(f, "operating system error"),

            OsFileNotFound(file) => write!(f, "system file not found: {}", file.display()),

            ReadFile(file) => write!(f, "cannot read file: {}", file.display()),

            ResourceNotFound(resource) => write!(f, "resource not found: {}", resource),

            Protocol => write!(f, "protocol not possible"),

            Temporary => write!(f, "temporary failure"),

            Usage => write!(f, "incorrect usage"),

            WriteFile(file) => write!(f, "cannot write to file: {}", file.display()),
        }
    }
}

impl ExitCode for CliError {
    fn exit_code(&self) -> i32 {
        self.into()
    }
}

impl From<CliError> for i32 {
    fn from(err: CliError) -> Self {
        (&err).into()
    }
}

impl From<&CliError> for i32 {
    fn from(err: &CliError) -> Self {
        use exitcode::*;
        use CliError::*;
        match err {
            Config => CONFIG,
            CreateFile(_) => CANTCREAT,
            InputData | ResourceNotFound(_) => DATAERR,
            InputFileNotFound(_) => NOINPUT,
            NoUser(_) => NOUSER,
            NoHost(_) => NOHOST,
            OperationPermission(_) => NOPERM,
            OsErr => OSERR,
            OsFileNotFound(_) => OSFILE,
            ReadFile(_) | WriteFile(_) => IOERR,
            Protocol => PROTOCOL,
            Temporary => TEMPFAIL,
            Usage => USAGE,
        }
    }
}