box Error container type

master
Avril 4 years ago
parent a006ccb8af
commit 5f57be3ed9
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -1,9 +1,6 @@
//! The available formats to convert
use super::*;
use std::io;
use std::{
error, fmt,
};
use object::Object;
@ -14,13 +11,11 @@ mod sexpr;
/// `Format` impl for CBOR.
mod cbor;
/// Config for the encode/decode
#[derive(Debug)]
pub struct Config{
//TODO: What goes here?
/// Any arbitrary data.
pub user: Option<Anything>,
}
pub mod error;
use error::*;
pub mod config;
use config::*;
/// A directive for a format on how to encode and decode objects.
#[derive(Clone, Copy)]
@ -62,133 +57,4 @@ pub static FORMATS: &[(&'static [&'static str], FormatDirective)] = &[
directive!(for cbor::CborFormatter => "cbor"),
];
/// A formatting error kind. See `Error`.
#[derive(Debug)]
pub enum ErrorKind
{
IO(io::Error),
Json(serde_json::Error),
Cbor(serde_cbor::Error),
Lexpr(serde_lexpr::Error),
Unknown,
}
impl From<io::Error> for ErrorKind
{
fn from(from: io::Error) -> Self
{
Self::IO(from)
}
}
impl From<serde_json::Error> for ErrorKind
{
fn from(from: serde_json::Error) -> Self
{
Self::Json(from)
}
}
impl From<serde_cbor::Error> for ErrorKind
{
fn from(from: serde_cbor::Error) -> Self
{
Self::Cbor(from)
}
}
impl From<serde_lexpr::Error> for ErrorKind
{
fn from(from: serde_lexpr::Error) -> Self
{
Self::Lexpr(from)
}
}
/// A formatting error.
#[derive(Debug)]
pub struct Error(ErrorKind, bool);
impl Error
{
#[inline(always)] fn into_mode(self, encode: bool) -> Self
{
Self(self.0, encode)
}
/// An encode error
#[inline] pub fn encode(kind: impl Into<ErrorKind>) -> Self
{
Self(kind.into(), true)
}
/// A decode error
#[inline] pub fn decode(kind: impl Into<ErrorKind>) -> Self
{
Self(kind.into(), false)
}
/// What kind of error was it?
#[inline] pub fn kind(&self) -> &ErrorKind
{
&self.0
}
/// Is an encode error?
#[inline] pub fn is_encode(&self) -> bool
{
self.1
}
/// Is a decode error?
#[inline] pub fn is_decode(&self) -> bool
{
!self.1
}
}
impl error::Error for Error
{
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
Some(match &self.0 {
ErrorKind::IO(i) => i,
ErrorKind::Json(i) => i,
ErrorKind::Cbor(i) => i,
ErrorKind::Lexpr(i) => i,
_ => return None,
})
}
}
impl fmt::Display for Error
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
write!(f, "formatting error: ")?;
if self.1 {
write!(f, "encode")
} else {
write!(f, "decode")
}
}
}
impl From<(io::Error, bool)> for Error
{
#[inline] fn from(from: (io::Error, bool)) -> Self
{
Self(ErrorKind::IO(from.0), from.1)
}
}
impl From<Error> for io::Error
{
fn from(from: Error) -> Self
{
match from.0
{
ErrorKind::IO(io) => io,
_ => io::Error::new(io::ErrorKind::Other, from),
}
}
}
//const _: &[u8; 0] = &[0u8; std::mem::size_of::<Error>()]; // Size of error type check (unboxed 56 -> boxed 16)

@ -0,0 +1,10 @@
//! Config elements. (If they're needed?)
use super::*;
/// Config for the encode/decode
#[derive(Debug, Default)]
pub struct Config{
//TODO: What goes here?
///// Any arbitrary data.
//pub user: Option<Anything>,
}

@ -0,0 +1,135 @@
//! Formatting error(s).
use super::*;
use std::{
error, fmt,
};
/// A formatting error kind. See `Error`.
#[derive(Debug)]
pub enum ErrorKind
{
IO(io::Error),
Json(serde_json::Error),
Cbor(serde_cbor::Error),
Lexpr(serde_lexpr::Error),
Unknown,
}
impl From<io::Error> for ErrorKind
{
fn from(from: io::Error) -> Self
{
Self::IO(from)
}
}
impl From<serde_json::Error> for ErrorKind
{
fn from(from: serde_json::Error) -> Self
{
Self::Json(from)
}
}
impl From<serde_cbor::Error> for ErrorKind
{
fn from(from: serde_cbor::Error) -> Self
{
Self::Cbor(from)
}
}
impl From<serde_lexpr::Error> for ErrorKind
{
fn from(from: serde_lexpr::Error) -> Self
{
Self::Lexpr(from)
}
}
/// A formatting error.
#[derive(Debug)]
pub struct Error(Box<ErrorKind>, bool);
impl Error
{
#[inline(always)] fn into_mode(self, encode: bool) -> Self
{
Self(self.0, encode)
}
/// An encode error
#[inline] pub fn encode(kind: impl Into<ErrorKind>) -> Self
{
Self(Box::new(kind.into()), true)
}
/// A decode error
#[inline] pub fn decode(kind: impl Into<ErrorKind>) -> Self
{
Self(Box::new(kind.into()), false)
}
/// What kind of error was it?
#[inline] pub fn kind(&self) -> &ErrorKind
{
&self.0
}
/// Is an encode error?
#[inline] pub fn is_encode(&self) -> bool
{
self.1
}
/// Is a decode error?
#[inline] pub fn is_decode(&self) -> bool
{
!self.1
}
}
impl error::Error for Error
{
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
Some(match self.0.as_ref() {
ErrorKind::IO(i) => i,
ErrorKind::Json(i) => i,
ErrorKind::Cbor(i) => i,
ErrorKind::Lexpr(i) => i,
_ => return None,
})
}
}
impl fmt::Display for Error
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
write!(f, "formatting error: ")?;
if self.1 {
write!(f, "encode")
} else {
write!(f, "decode")
}
}
}
impl From<(io::Error, bool)> for Error
{
#[inline] fn from(from: (io::Error, bool)) -> Self
{
Self(Box::new(ErrorKind::IO(from.0)), from.1)
}
}
impl From<Error> for io::Error
{
fn from(from: Error) -> Self
{
match *from.0
{
ErrorKind::IO(io) => io,
_ => io::Error::new(io::ErrorKind::Other, from),
}
}
}
Loading…
Cancel
Save