1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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));
}
|