preserves/implementations/rust/preserves/src/error.rs

119 lines
2.4 KiB
Rust

use num_bigint::BigInt;
use std::convert::From;
use std::io;
#[derive(Debug)]
pub enum Error {
Io(io::Error),
Message(String),
NumberOutOfRange(BigInt),
MissingCloseDelimiter,
MissingItem,
Expected(ExpectedKind),
}
#[derive(Debug, PartialEq)]
pub enum ExpectedKind {
Boolean,
Float,
Double,
SignedIntegerI128,
SignedIntegerU128,
SignedInteger,
String,
ByteString,
Symbol,
Record,
SimpleRecord(String),
Sequence,
Set,
Dictionary,
Embedded,
Annotation,
}
#[derive(Debug)]
pub enum ReadError {
UnsupportedFormat,
Io(io::Error),
}
impl From<ExpectedKind> for Error {
fn from(e: ExpectedKind) -> Self {
Error::Expected(e)
}
}
impl From<io::Error> for Error {
fn from(e: io::Error) -> Self {
Error::Io(e)
}
}
impl From<ReadError> for Error {
fn from(e: ReadError) -> Self {
match e {
ReadError::UnsupportedFormat => Error::Message(format!("{}", e)),
ReadError::Io(i) => Error::Io(i),
}
}
}
impl From<ReadError> for io::Error {
fn from(e: ReadError) -> Self {
match e {
ReadError::UnsupportedFormat => Error::from(e).into(),
ReadError::Io(i) => i,
}
}
}
impl From<io::Error> for ReadError {
fn from(e: io::Error) -> Self {
ReadError::Io(e)
}
}
impl std::fmt::Display for ReadError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ReadError::UnsupportedFormat => write!(f, "Unsupported Preserves format"),
ReadError::Io(i) => write!(f, "{}", i),
}
}
}
impl From<Error> for io::Error {
fn from(e: Error) -> Self {
match e {
Error::Io(ioe) => ioe,
Error::Message(str) => io::Error::new(io::ErrorKind::Other, str),
_ => io::Error::new(io::ErrorKind::Other, e),
}
}
}
impl std::error::Error for ExpectedKind {}
impl std::error::Error for ReadError {}
impl std::error::Error for Error {}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl std::fmt::Display for ExpectedKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
pub fn io_eof() -> io::Error {
io::Error::new(io::ErrorKind::UnexpectedEof, "EOF")
}