1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
use std::error::Error as StdError; use std::fmt; use std::io::{self, Error as IoError}; use bulletproofs::r1cs::R1CSError; use dusk_tlv::Error as TlvError; macro_rules! from_error { ($t:ty, $id:ident) => { impl From<$t> for Error { fn from(e: $t) -> Self { Error::$id(e) } } }; } #[derive(Debug)] pub enum Error { Io(IoError), Other(String), R1CS(R1CSError), Tlv(TlvError), UnexpectedEof, } impl Error { pub fn io_unexpected_eof<S: ToString>(description: S) -> Self { let description = description.to_string(); Error::Io(io::Error::new(io::ErrorKind::UnexpectedEof, description)) } pub fn io_invalid_data<S: ToString>(description: S) -> Self { let description = description.to_string(); Error::Io(io::Error::new(io::ErrorKind::InvalidData, description)) } } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Error::Io(e) => write!(f, "{}", e), Error::Other(s) => write!(f, "{}", s), Error::R1CS(e) => write!(f, "{}", e), Error::Tlv(e) => write!(f, "{}", e), Error::UnexpectedEof => write!(f, "Unexpected end of file"), } } } impl StdError for Error { fn source(&self) -> Option<&(dyn StdError + 'static)> { match self { Error::Io(e) => Some(e), Error::Tlv(e) => Some(e), _ => None, } } } from_error!(IoError, Io); from_error!(R1CSError, R1CS); from_error!(TlvError, Tlv);