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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
use std::fmt::Display; use serde::de::Error as DeError; use serde::ser::Error as SerError; error_chain! { types { Error, ErrorKind, ResultExt, Result; } foreign_links { Io(::std::io::Error); FromUtf8Error(::std::string::FromUtf8Error); ParseIntError(::std::num::ParseIntError); ParseFloatError(::std::num::ParseFloatError); ParseBoolError(::std::str::ParseBoolError); Syntax(::xml::reader::Error); } errors { UnexpectedToken(token: String, found: String) { description("unexpected token") display("Expected token {}, found {}", token, found) } Custom(field: String) { description("other error") display("custom: '{}'", field) } UnsupportedOperation(operation: String) { description("unsupported operation") display("unsupported operation: '{}'", operation) } } } macro_rules! expect { ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => { match $actual { $($expected)|+ => $if_ok, actual => Err($crate::ErrorKind::UnexpectedToken( stringify!($($expected)|+).to_string(), format!("{:?}",actual) ).into()) as Result<_> } } } #[cfg(debug_assertions)] macro_rules! debug_expect { ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => { match $actual { $($expected)|+ => $if_ok, actual => panic!( "Internal error: Expected token {}, found {:?}", stringify!($($expected)|+), actual ) } } } #[cfg(not(debug_assertions))] macro_rules! debug_expect { ($actual: expr, $($expected: pat)|+ => $if_ok: expr) => { match $actual { $($expected)|+ => $if_ok, _ => unreachable!() } } } impl DeError for Error { fn custom<T: Display>(msg: T) -> Self { ErrorKind::Custom(msg.to_string()).into() } } impl SerError for Error { fn custom<T: Display>(msg: T) -> Self { ErrorKind::Custom(msg.to_string()).into() } }