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
use failure::_core::fmt::{Display, Error, Formatter};
use std::io;

#[derive(Debug, Fail)]
pub enum ECnfLoaderError {
    ReadFail(io::Error),
    /// line_num, line
    FailParseKey(u16, String),
    /// line_num, res_prefix
    FailParse(u16, String),
    /// line_num, line
    IllegalRightMidParen(u16, String),
    /// line_num, line, separator
    UnknownSeparator(u16, String, char),
    /// line_num, line, value
    UnknownValue(u16, String, String),
}

impl Display for ECnfLoaderError {
    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
        use ECnfLoaderError::*;
        return match self {
            ReadFail(io_e) => write!(f, "Read Fail: {}", io_e),
            FailParseKey(n, s) => write!(f, "Fail parse key at line: \"{}\" in {}", s, n),
            FailParse(n, prefix) => {
                write!(f, "Illegal End Line for prefix: \"{}\" in {}", prefix, n)
            }
            IllegalRightMidParen(n, l) => {
                write!(f, "Unknown end mid paren on line: \"{}\" in {}", l, n)
            }
            UnknownSeparator(n, l, sep) => write!(
                f,
                "Unknown key-value separator: \"{}\" on line: \"{}\" in {}",
                sep, l, n
            ),
            UnknownValue(n, l, v) => {
                write!(f, "Unknown value: \"{}\" of line: \"{}\" in {}", v, l, n)
            }
        };
    }
}

impl From<io::Error> for ECnfLoaderError {
    fn from(e: io::Error) -> Self {
        ECnfLoaderError::ReadFail(e)
    }
}