//! The `result` module exposes a Result type that propagates one of many different Error types. use bincode; use serde_json; use std; use std::any::Any; #[derive(Debug)] pub enum Error { IO(std::io::Error), JSON(serde_json::Error), AddrParse(std::net::AddrParseError), JoinError(Box), RecvError(std::sync::mpsc::RecvError), RecvTimeoutError(std::sync::mpsc::RecvTimeoutError), Serialize(std::boxed::Box), SendError, Services, } pub type Result = std::result::Result; impl std::convert::From for Error { fn from(e: std::sync::mpsc::RecvError) -> Error { Error::RecvError(e) } } impl std::convert::From for Error { fn from(e: std::sync::mpsc::RecvTimeoutError) -> Error { Error::RecvTimeoutError(e) } } impl std::convert::From> for Error { fn from(_e: std::sync::mpsc::SendError) -> Error { Error::SendError } } impl std::convert::From> for Error { fn from(e: Box) -> Error { Error::JoinError(e) } } impl std::convert::From for Error { fn from(e: std::io::Error) -> Error { Error::IO(e) } } impl std::convert::From for Error { fn from(e: serde_json::Error) -> Error { Error::JSON(e) } } impl std::convert::From for Error { fn from(e: std::net::AddrParseError) -> Error { Error::AddrParse(e) } } impl std::convert::From> for Error { fn from(e: std::boxed::Box) -> Error { Error::Serialize(e) } } #[cfg(test)] mod tests { use result::Error; use result::Result; use serde_json; use std::io; use std::io::Write; use std::net::SocketAddr; use std::sync::mpsc::channel; use std::sync::mpsc::RecvError; use std::sync::mpsc::RecvTimeoutError; use std::thread; fn addr_parse_error() -> Result { let r = "12fdfasfsafsadfs".parse()?; Ok(r) } fn join_error() -> Result<()> { let r = thread::spawn(|| panic!("hi")).join()?; Ok(r) } fn json_error() -> Result<()> { let r = serde_json::from_slice("=342{;;;;:}".as_bytes())?; Ok(r) } fn send_error() -> Result<()> { let (s, r) = channel(); drop(r); s.send(())?; Ok(()) } #[test] fn from_test() { assert_matches!(addr_parse_error(), Err(Error::AddrParse(_))); assert_matches!(Error::from(RecvError {}), Error::RecvError(_)); assert_matches!( Error::from(RecvTimeoutError::Timeout), Error::RecvTimeoutError(_) ); assert_matches!(send_error(), Err(Error::SendError)); assert_matches!(join_error(), Err(Error::JoinError(_))); let ioe = io::Error::new(io::ErrorKind::NotFound, "hi"); assert_matches!(Error::from(ioe), Error::IO(_)); } #[test] fn fmt_test() { write!(io::sink(), "{:?}", addr_parse_error()).unwrap(); write!(io::sink(), "{:?}", Error::from(RecvError {})).unwrap(); write!(io::sink(), "{:?}", Error::from(RecvTimeoutError::Timeout)).unwrap(); write!(io::sink(), "{:?}", send_error()).unwrap(); write!(io::sink(), "{:?}", join_error()).unwrap(); write!(io::sink(), "{:?}", json_error()).unwrap(); write!( io::sink(), "{:?}", Error::from(io::Error::new(io::ErrorKind::NotFound, "hi")) ).unwrap(); } }