#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ErrorCode {
BadLength,
StatefulLeavesExhausted,
EnvelopeMalformed,
SigningFailed,
KeygenFailed,
InvalidInput,
ImportInvalid,
}
impl ErrorCode {
pub const ALL: [ErrorCode; 7] = [
ErrorCode::BadLength,
ErrorCode::StatefulLeavesExhausted,
ErrorCode::EnvelopeMalformed,
ErrorCode::SigningFailed,
ErrorCode::KeygenFailed,
ErrorCode::InvalidInput,
ErrorCode::ImportInvalid,
];
pub const fn as_str(self) -> &'static str {
match self {
ErrorCode::BadLength => "ERR_BAD_LENGTH",
ErrorCode::StatefulLeavesExhausted => "ERR_STATEFUL_LEAVES_EXHAUSTED",
ErrorCode::EnvelopeMalformed => "ERR_ENVELOPE_MALFORMED",
ErrorCode::SigningFailed => "ERR_SIGNING_FAILED",
ErrorCode::KeygenFailed => "ERR_KEYGEN_FAILED",
ErrorCode::InvalidInput => "ERR_INVALID_INPUT",
ErrorCode::ImportInvalid => "ERR_IMPORT_INVALID",
}
}
}
impl core::fmt::Display for ErrorCode {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::ErrorCode;
#[test]
fn as_str_matches_the_published_wasm_strings() {
assert_eq!(ErrorCode::BadLength.as_str(), "ERR_BAD_LENGTH");
assert_eq!(
ErrorCode::StatefulLeavesExhausted.as_str(),
"ERR_STATEFUL_LEAVES_EXHAUSTED"
);
assert_eq!(
ErrorCode::EnvelopeMalformed.as_str(),
"ERR_ENVELOPE_MALFORMED"
);
assert_eq!(ErrorCode::SigningFailed.as_str(), "ERR_SIGNING_FAILED");
assert_eq!(ErrorCode::KeygenFailed.as_str(), "ERR_KEYGEN_FAILED");
assert_eq!(ErrorCode::InvalidInput.as_str(), "ERR_INVALID_INPUT");
assert_eq!(ErrorCode::ImportInvalid.as_str(), "ERR_IMPORT_INVALID");
}
#[test]
fn all_lists_every_variant_exactly_once() {
let mut seen: alloc::vec::Vec<&'static str> =
ErrorCode::ALL.iter().map(|code| code.as_str()).collect();
seen.sort_unstable();
let before = seen.len();
seen.dedup();
assert_eq!(before, 7, "ALL must hold seven codes");
assert_eq!(seen.len(), 7, "two variants share one string");
}
}