#[derive(Debug, Copy, Clone, PartialEq, Eq, thiserror::Error)]
pub enum KeyError {
#[error("Key does not reach a leaf")]
TooShort,
#[error("Key not found")]
NotFound,
#[error("Key goes beyond a leaf")]
TooLong,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, thiserror::Error)]
pub enum DescendError<E> {
#[error(transparent)]
Key(#[from] KeyError),
#[error("Visitor failed")]
Inner(#[source] E),
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, thiserror::Error)]
pub enum ValueError {
#[error(transparent)]
Key(#[from] KeyError),
#[error("Variant absent")]
Absent,
#[error("Access/validation failure: {0}")]
Access(&'static str),
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, thiserror::Error)]
pub enum SerdeError<E> {
#[error(transparent)]
Value(#[from] ValueError),
#[error("(De)serialization")]
Inner(#[source] E),
#[error("(De)serializer finalization")]
Finalization(#[source] E),
}
impl<E> From<KeyError> for SerdeError<E> {
fn from(value: KeyError) -> Self {
SerdeError::Value(value.into())
}
}
impl<E> TryFrom<SerdeError<E>> for KeyError {
type Error = SerdeError<E>;
fn try_from(value: SerdeError<E>) -> Result<Self, Self::Error> {
match value {
SerdeError::Value(ValueError::Key(e)) => Ok(e),
e => Err(e),
}
}
}
impl TryFrom<ValueError> for KeyError {
type Error = ValueError;
fn try_from(value: ValueError) -> Result<Self, Self::Error> {
match value {
ValueError::Key(e) => Ok(e),
e => Err(e),
}
}
}
impl<E> TryFrom<DescendError<E>> for KeyError {
type Error = E;
fn try_from(value: DescendError<E>) -> Result<Self, Self::Error> {
match value {
DescendError::Key(e) => Ok(e),
DescendError::Inner(e) => Err(e),
}
}
}
impl<E> TryFrom<SerdeError<E>> for ValueError {
type Error = E;
fn try_from(value: SerdeError<E>) -> Result<Self, Self::Error> {
match value {
SerdeError::Value(e) => Ok(e),
SerdeError::Finalization(e) | SerdeError::Inner(e) => Err(e),
}
}
}