use std::fmt;
#[derive(Debug)]
pub enum Error {
InvalidPrefix,
InvalidStructure,
InvalidLength,
InvalidUtf8,
InvalidPubkey,
UnknownKind(u8),
TagTooLong,
Bech32Error(bitcoin::bech32::DecodeError),
Base64DecodeError(bitcoin::base64::DecodeError),
CborError(ciborium::de::Error<std::io::Error>),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::InvalidPrefix => write!(f, "Invalid bech32m prefix, expected 'creqb'"),
Error::InvalidStructure => write!(f, "Invalid TLV structure"),
Error::InvalidLength => write!(f, "Invalid TLV field length"),
Error::InvalidUtf8 => write!(f, "Invalid UTF-8 encoding in string field"),
Error::InvalidPubkey => write!(f, "Invalid public key"),
Error::UnknownKind(kind) => write!(f, "Unknown NUT-10 kind: {}", kind),
Error::TagTooLong => write!(f, "Tag exceeds 255 byte limit"),
Error::Bech32Error(e) => write!(f, "Bech32 error: {}", e),
Error::Base64DecodeError(e) => write!(f, "Base64 decode error: {}", e),
Error::CborError(e) => write!(f, "CBOR error: {}", e),
}
}
}
impl std::error::Error for Error {}
impl From<bitcoin::bech32::DecodeError> for Error {
fn from(e: bitcoin::bech32::DecodeError) -> Self {
Error::Bech32Error(e)
}
}
impl From<bitcoin::base64::DecodeError> for Error {
fn from(e: bitcoin::base64::DecodeError) -> Self {
Error::Base64DecodeError(e)
}
}
impl From<ciborium::de::Error<std::io::Error>> for Error {
fn from(e: ciborium::de::Error<std::io::Error>) -> Self {
Error::CborError(e)
}
}