diff options
Diffstat (limited to 'sop/src/errors.rs')
-rw-r--r-- | sop/src/errors.rs | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/sop/src/errors.rs b/sop/src/errors.rs new file mode 100644 index 00000000..0eae86b7 --- /dev/null +++ b/sop/src/errors.rs @@ -0,0 +1,101 @@ +/// Errors defined by the Stateless OpenPGP Protocol. +#[derive(thiserror::Error, Debug, Clone)] +pub enum Error { + /// No acceptable signatures found ("sop verify"). + #[error("No acceptable signatures found")] + NoSignature, + + /// Asymmetric algorithm unsupported ("sop encrypt"). + #[error("Asymmetric algorithm unsupported")] + UnsupportedAsymmetricAlgo, + + /// Certificate not encryption-capable (e.g., expired, revoked, + /// unacceptable usage flags) ("sop encrypt"). + #[error("Certificate not encryption-capable")] + CertCannotEncrypt, + + /// Missing required argument. + #[error("Missing required argument")] + MissingArg, + + /// Incomplete verification instructions ("sop decrypt"). + #[error("Incomplete verification instructions")] + IncompleteVerification, + + /// Unable to decrypt ("sop decrypt"). + #[error("Unable to decrypt")] + CannotDecrypt, + + /// Non-"UTF-8" or otherwise unreliable password ("sop encrypt"). + #[error("Non-UTF-8 or otherwise unreliable password")] + PasswordNotHumanReadable, + + /// Unsupported option. + #[error("Unsupported option")] + UnsupportedOption, + + /// Invalid data type (no secret key where "KEY" expected, etc). + #[error("Invalid data type")] + BadData, + + /// Non-text input where text expected. + #[error("Non-text input where text expected")] + ExpectedText, + + /// Output file already exists. + #[error("Output file already exists")] + OutputExists, + + /// Input file does not exist. + #[error("Input file does not exist")] + MissingInput, + + /// A "KEY" input is protected (locked) with a password, and "sop" cannot + /// unlock it. + #[error("A KEY input is protected with a password")] + KeyIsProtected, + + /// Unsupported subcommand. + #[error("Unsupported subcommand")] + UnsupportedSubcommand, + + /// An indirect parameter is a special designator (it starts with "@") but + /// "sop" does not know how to handle the prefix. + #[error("An indirect parameter is a special designator with unknown prefix")] + UnsupportedSpecialPrefix, + + /// A indirect input parameter is a special designator (it starts with + /// "@"), and a filename matching the designator is actually present. + #[error("A indirect input parameter is a special designator matches file")] + AmbiguousInput, +} + +impl From<Error> for i32 { + fn from(e: Error) -> Self { + use Error::*; + match e { + NoSignature => 3, + UnsupportedAsymmetricAlgo => 13, + CertCannotEncrypt => 17, + MissingArg => 19, + IncompleteVerification => 23, + CannotDecrypt => 29, + PasswordNotHumanReadable => 31, + UnsupportedOption => 37, + BadData => 41, + ExpectedText => 53, + OutputExists => 59, + MissingInput => 61, + KeyIsProtected => 67, + UnsupportedSubcommand => 69, + UnsupportedSpecialPrefix => 71, + AmbiguousInput => 73, + } + } +} + +/// Prints the error and causes, if any. +pub fn print_error_chain(err: &anyhow::Error) { + eprintln!(" {}", err); + err.chain().skip(1).for_each(|cause| eprintln!(" because: {}", cause)); +} |