From 7e4db2c0697a6a341c533584c7add55a9e842ddb Mon Sep 17 00:00:00 2001 From: Andrey Cherkashin <148123+andoriyu@users.noreply.github.com> Date: Sat, 21 Mar 2020 17:39:29 -0700 Subject: [PATCH] feat: Ability to "wrap" other errors inside ObjectError. --- src/raw.rs | 10 ++++++++++ src/raw/object.rs | 16 +++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/raw.rs b/src/raw.rs index 6c7ab67..68e6cec 100644 --- a/src/raw.rs +++ b/src/raw.rs @@ -26,6 +26,8 @@ mod test { use crate::raw::object::Object; use crate::raw::parser::Parser; use libucl_bind::ucl_type_t; + use std::error::Error; + use std::path::Display; #[test] fn string_parsing() { @@ -190,4 +192,12 @@ mod test { assert_eq!(ucl_type_t::UCL_STRING, obj_str.kind()); assert_eq!("a string without null", obj_str.as_string().unwrap()); } + + #[test] + fn dyn_error() { + let err = std::io::Error::from_raw_os_error(42); + let err = ObjectError::other(err); + + assert!(err.to_string().contains("os error 42")); + } } diff --git a/src/raw/object.rs b/src/raw/object.rs index 1c2408e..48ccb29 100644 --- a/src/raw/object.rs +++ b/src/raw/object.rs @@ -4,7 +4,7 @@ use crate::raw::{utils, Priority}; use crate::traits::FromObject; use bitflags::_core::borrow::Borrow; use bitflags::_core::convert::Infallible; -use bitflags::_core::fmt::Formatter; +use bitflags::_core::fmt::{Formatter, Display}; use libucl_bind::{ ucl_object_frombool, ucl_object_fromdouble, ucl_object_fromint, ucl_object_fromstring, ucl_object_get_priority, ucl_object_key, ucl_object_lookup, ucl_object_lookup_path, @@ -42,6 +42,8 @@ pub enum ObjectError { IntConversionError(TryFromIntError), /// Wrapper around `AddrParseError`. AddrParseError(AddrParseError), + /// An error that we couldn't match to internal type. + Other(String), /// Not an error, but required for some conversions. None, } @@ -49,9 +51,20 @@ pub enum ObjectError { impl Error for ObjectError {} impl ObjectError { + /// Wrap error in Box<>. pub fn boxed(self) -> Box { Box::new(self) } + + /// Wrap error in Box<> and erase its type. + pub fn boxed_dyn(self) -> Box { + Box::new(self) + } + + /// Create a new error `Other` by extracting the error description. + pub fn other(err: E) -> ObjectError { + ObjectError::Other(err.to_string()) + } } impl From for ObjectError { fn from(_: Infallible) -> Self { @@ -85,6 +98,7 @@ impl fmt::Display for ObjectError { ), ObjectError::IntConversionError(e) => e.fmt(f), ObjectError::AddrParseError(e) => e.fmt(f), + ObjectError::Other(e) => e.fmt(f), ObjectError::None => write!(f, "Impossible error was possible after all."), } }