use std::{borrow::Borrow, error::Error, fmt::Display};
#[derive(Debug, Clone)]
pub struct DomainSeparatorMismatch(String);
#[derive(Debug, Clone)]
pub enum ProofError {
InvalidProof,
InvalidDomainSeparator(DomainSeparatorMismatch),
SerializationError,
}
pub type ProofResult<T> = Result<T, ProofError>;
impl Display for DomainSeparatorMismatch {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.0)
}
}
impl Display for ProofError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::SerializationError => write!(f, "Serialization Error"),
Self::InvalidDomainSeparator(e) => e.fmt(f),
Self::InvalidProof => write!(f, "Invalid proof"),
}
}
}
impl Error for DomainSeparatorMismatch {}
impl Error for ProofError {}
impl From<&str> for DomainSeparatorMismatch {
fn from(s: &str) -> Self {
s.to_string().into()
}
}
impl From<String> for DomainSeparatorMismatch {
fn from(s: String) -> Self {
Self(s)
}
}
impl<B: Borrow<DomainSeparatorMismatch>> From<B> for ProofError {
fn from(value: B) -> Self {
Self::InvalidDomainSeparator(value.borrow().clone())
}
}
impl From<std::io::Error> for DomainSeparatorMismatch {
fn from(value: std::io::Error) -> Self {
Self(value.to_string())
}
}