use std::fmt::{self, Display};
mod der;
mod writer;
pub use der::*;
pub use writer::*;
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum Error {
BadBooleanValue,
LeadingZero,
LessThanMinimum,
LongLengthNotSupported,
HighTagNumberForm,
Io,
NegativeValue,
NonCanonical,
NonZeroUnusedBits,
Read,
UnexpectedEnd,
UnknownTag,
WrongTag,
WrongValue,
}
impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let s = match *self {
Error::BadBooleanValue => "bad boolean value",
Error::LeadingZero => "leading zero",
Error::LessThanMinimum => "less than minimum",
Error::LongLengthNotSupported => "long length not supported",
Error::HighTagNumberForm => "high tag number form",
Error::Io => "I/O",
Error::NegativeValue => "negative value",
Error::NonCanonical => "non-canonical",
Error::NonZeroUnusedBits => "non-zero unused bits",
Error::Read => "read",
Error::UnexpectedEnd => "unexpected end",
Error::UnknownTag => "unknown tag",
Error::WrongTag => "wrong tag",
Error::WrongValue => "wrong value",
};
s.fmt(f)
}
}
impl ::std::error::Error for Error {
fn description(&self) -> &str {
match *self {
Error::BadBooleanValue => "bad boolean value",
Error::LeadingZero => "leading zero",
Error::LessThanMinimum => "less than minimum",
Error::LongLengthNotSupported => "long length not supported",
Error::HighTagNumberForm => "high tag number form",
Error::Io => "I/O",
Error::NegativeValue => "negative value",
Error::NonCanonical => "non-canonical",
Error::NonZeroUnusedBits => "non-zero unused bits",
Error::Read => "read",
Error::UnexpectedEnd => "unexpected end",
Error::UnknownTag => "unknown tag",
Error::WrongTag => "wrong tag",
Error::WrongValue => "wrong value",
}
}
}
impl From<untrusted::EndOfInput> for Error {
fn from(_: untrusted::EndOfInput) -> Error {
Error::UnexpectedEnd
}
}
impl From<::std::io::Error> for Error {
fn from(_: ::std::io::Error) -> Error {
Error::Io
}
}
pub type Result<T> = ::std::result::Result<T, Error>;