use std::path::PathBuf; use narrate::{CliError, ExitCode}; #[test] fn outputs() { cli_error_array().iter().for_each(assert_error_msg_and_code); } #[test] fn impl_std_error() { fn assert_std_error(_e: impl std::error::Error) {} assert_std_error(CliError::Config); } struct ErrorTest { error: CliError, msg: String, code: i32, } fn assert_error_msg_and_code(error_test: &ErrorTest) { let ErrorTest { error, msg, code } = error_test; assert_eq!( *code, error.exit_code(), "CliError: `{:?}` ExitCode should be: `{}`, got: `{}`", error, code, error.exit_code() ); assert_eq!( *msg, error.to_string(), "\nCliError: `{:?}`\nshould display: `{}`\n got: `{}`\n", error, msg, error, ); } fn cli_error_array() -> [ErrorTest; 15] { let path_buf = PathBuf::from("path"); [ ErrorTest { error: CliError::Config, msg: "invalid configuration".into(), code: exitcode::CONFIG, }, ErrorTest { error: CliError::CreateFile(path_buf.clone()), msg: format!("cannot create file: {}", path_buf.display()), code: exitcode::CANTCREAT, }, ErrorTest { error: CliError::InputData, msg: "invalid input data".into(), code: exitcode::DATAERR, }, ErrorTest { error: CliError::InputFileNotFound(path_buf.clone()), msg: format!("file not found: {}", path_buf.display()), code: exitcode::NOINPUT, }, ErrorTest { error: CliError::NoUser("username".into()), msg: "user not found: username".into(), code: exitcode::NOUSER, }, ErrorTest { error: CliError::NoHost("hostname".into()), msg: "host not found: hostname".into(), code: exitcode::NOHOST, }, ErrorTest { error: CliError::OperationPermission("operation".into()), msg: "no permission for operation: operation".into(), code: exitcode::NOPERM, }, ErrorTest { error: CliError::OsErr, msg: "operating system error".into(), code: exitcode::OSERR, }, ErrorTest { error: CliError::OsFileNotFound(path_buf.clone()), msg: format!("system file not found: {}", path_buf.display()), code: exitcode::OSFILE, }, ErrorTest { error: CliError::ReadFile(path_buf.clone()), msg: format!("cannot read file: {}", path_buf.display()), code: exitcode::IOERR, }, ErrorTest { error: CliError::ResourceNotFound("resource".into()), msg: "resource not found: resource".into(), code: exitcode::DATAERR, }, ErrorTest { error: CliError::Protocol, msg: "protocol not possible".into(), code: exitcode::PROTOCOL, }, ErrorTest { error: CliError::Temporary, msg: "temporary failure".into(), code: exitcode::TEMPFAIL, }, ErrorTest { error: CliError::Usage, msg: "incorrect usage".into(), code: exitcode::USAGE, }, ErrorTest { error: CliError::WriteFile(path_buf.clone()), msg: format!("cannot write to file: {}", path_buf.display()), code: exitcode::IOERR, }, ] }