#[cfg(feature = "alloc")]
#[allow(
unused_imports,
reason = "alloc prelude items; subset used per cfg/feature combination"
)]
use alloc::{format, string::String, string::ToString};
#[derive(Debug, thiserror::Error)]
pub enum SignatureError {
#[error("signing failed: {0}")]
SigningFailed(String),
#[error("invalid signature bytes: expected {expected} bytes, got {actual}")]
InvalidSignatureLength {
expected: usize,
actual: usize,
},
#[error("verification failed: {0}")]
VerificationFailed(String),
}
#[derive(Debug, thiserror::Error)]
pub enum KeyError {
#[error("invalid seed bytes: expected {expected} bytes, got {actual}")]
InvalidSeedLength {
expected: usize,
actual: usize,
},
#[error("invalid seed bytes: {0}")]
InvalidSeedBytes(String),
#[error("invalid seed code: expected {expected}, got {actual}")]
InvalidSeedCode {
expected: String,
actual: String,
},
#[error("invalid public key bytes: {0}")]
InvalidPublicKey(String),
#[error("key generation failed: {0}")]
GenerationFailed(String),
#[error("key build failed: {0}")]
BuildFailed(String),
}
#[derive(Debug, thiserror::Error)]
pub enum DigestError {
#[error("digest build failed: {0}")]
BuildFailed(String),
}
#[derive(Debug, thiserror::Error)]
pub enum CodeMismatchError {
#[error("verkey code {verkey} incompatible with signature code {signature}")]
IncompatibleCodes {
verkey: String,
signature: String,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn signature_error_displays_signing_failed() {
let err = SignatureError::SigningFailed("test".into());
assert_eq!(err.to_string(), "signing failed: test");
}
#[test]
fn signature_error_displays_invalid_length() {
let err = SignatureError::InvalidSignatureLength {
expected: 64,
actual: 32,
};
assert!(err.to_string().contains("64"));
assert!(err.to_string().contains("32"));
}
#[test]
fn key_error_displays_invalid_seed_length() {
let err = KeyError::InvalidSeedLength {
expected: 32,
actual: 16,
};
assert!(err.to_string().contains("32"));
assert!(err.to_string().contains("16"));
}
#[test]
fn code_mismatch_error_displays_incompatible() {
let err = CodeMismatchError::IncompatibleCodes {
verkey: "Ed25519".into(),
signature: "ECDSA256k1Sig".into(),
};
assert!(err.to_string().contains("Ed25519"));
assert!(err.to_string().contains("ECDSA256k1Sig"));
}
#[test]
fn key_error_displays_invalid_seed_bytes() {
let err = KeyError::InvalidSeedBytes("some reason".into());
assert!(err.to_string().contains("some reason"));
assert!(err.to_string().contains("invalid seed bytes"));
}
#[test]
fn key_error_displays_invalid_public_key() {
let err = KeyError::InvalidPublicKey("bad key data".into());
assert!(err.to_string().contains("bad key data"));
assert!(err.to_string().contains("invalid public key"));
}
#[test]
fn key_error_displays_generation_failed() {
let err = KeyError::GenerationFailed("rng error".into());
assert!(err.to_string().contains("rng error"));
assert!(err.to_string().contains("generation failed"));
}
#[test]
fn signature_error_displays_verification_failed() {
let err = SignatureError::VerificationFailed("bad sig".into());
assert!(err.to_string().contains("bad sig"));
assert!(err.to_string().contains("verification failed"));
}
#[test]
fn key_error_displays_invalid_seed_code() {
let err = KeyError::InvalidSeedCode {
expected: "Ed25519Seed".into(),
actual: "ECDSA256k1Seed".into(),
};
let msg = err.to_string();
assert!(msg.contains("Ed25519Seed"));
assert!(msg.contains("ECDSA256k1Seed"));
assert!(msg.contains("invalid seed code"));
}
#[test]
fn signature_error_debug_format() {
let err = SignatureError::SigningFailed("debug test".into());
let debug = format!("{err:?}");
assert!(debug.contains("SigningFailed"));
assert!(debug.contains("debug test"));
}
#[test]
fn key_error_debug_format() {
let err = KeyError::InvalidSeedLength {
expected: 32,
actual: 0,
};
let debug = format!("{err:?}");
assert!(debug.contains("InvalidSeedLength"));
}
#[test]
fn code_mismatch_error_debug_format() {
let err = CodeMismatchError::IncompatibleCodes {
verkey: "Ed25519".into(),
signature: "ECDSA256k1Sig".into(),
};
let debug = format!("{err:?}");
assert!(debug.contains("IncompatibleCodes"));
}
}