env_lang/
struct_envlang_error.rs

1use std::fmt;
2use core::fmt::Display;
3use failure::{Backtrace, Context, Fail};
4
5// ------------------------------------------------------------------------------------
6// Error
7// ------------------------------------------------------------------------------------
8#[derive(Debug)]
9pub struct EnvLangError {
10    pub inner: Context<EnvLangErrorKind>,
11}
12
13#[derive(Fail, Debug, Clone, Eq, PartialEq)]
14pub enum EnvLangErrorKind {
15    SpaceNotAllow,
16    TooManyPoint,
17    TooManyUnderscore,
18    TooManyArobase,
19}
20
21impl fmt::Display for EnvLangErrorKind {
22    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
23        match *self {
24            EnvLangErrorKind::SpaceNotAllow => { write!(f, "space not allow") },
25            EnvLangErrorKind::TooManyPoint => { write!(f, "split by point return more than 2 chunks") },
26            EnvLangErrorKind::TooManyUnderscore => { write!(f, "split by underscore return more than 2 chunks") },
27            EnvLangErrorKind::TooManyArobase => { write!(f, "split by arobase return more than 2 chunks") },
28        }
29    }
30}
31
32#[cfg_attr(tarpaulin, skip)]
33impl Fail for EnvLangError {
34    fn cause(&self) -> Option<&Fail> {
35        self.inner.cause()
36    }
37    fn backtrace(&self) -> Option<&Backtrace> {
38        self.inner.backtrace()
39    }
40}
41
42impl Display for EnvLangError {
43    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
44        Display::fmt(&self.inner, f)
45    }
46}
47
48impl EnvLangError {
49    pub fn kind(&self) -> &EnvLangErrorKind {
50        &*self.inner.get_context()
51    }
52}
53
54impl From<EnvLangErrorKind> for EnvLangError {
55    fn from(kind: EnvLangErrorKind) -> EnvLangError {
56        EnvLangError { inner: Context::new(kind)}
57    }
58}