use std::fmt;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("invalid integer at position {position}: {detail}")]
InvalidInteger {
position: usize,
detail: String,
},
#[error("invalid byte string at position {position}: {detail}")]
InvalidByteString {
position: usize,
detail: String,
},
#[error("unexpected byte {byte:#04x} at position {position}, expected {expected}")]
UnexpectedByte {
byte: u8,
position: usize,
expected: &'static str,
},
#[error("unexpected end of input at position {position}: {context}")]
UnexpectedEof {
position: usize,
context: String,
},
#[error("dictionary keys not sorted at position {position}")]
UnsortedKeys {
position: usize,
},
#[error("{count} trailing byte(s) after value at position {position}")]
TrailingData {
position: usize,
count: usize,
},
#[error("key {key:?} not found in dictionary")]
KeyNotFound {
key: String,
},
#[error("expected dictionary at position {position}")]
NotADictionary {
position: usize,
},
#[error("{0}")]
Custom(String),
}
impl serde::ser::Error for Error {
fn custom<T: fmt::Display>(msg: T) -> Self {
Self::Custom(msg.to_string())
}
}
impl serde::de::Error for Error {
fn custom<T: fmt::Display>(msg: T) -> Self {
Self::Custom(msg.to_string())
}
}