mabel_eno/
error.rs

1use std::fmt;
2
3use crate::locale::Locale;
4
5/// `line` is 1-indexed (i.e. the first line is line 1, not 0)
6#[derive(Debug)]
7pub struct Error {
8    pub line: u32,
9    pub message: String,
10    source: Option<Box<dyn std::error::Error>>,
11}
12
13impl Error {
14    pub fn new(message: String, line_number: u32) -> Error {
15        Error {
16            line: line_number,
17            message,
18            source: None,
19        }
20    }
21
22    pub fn with_source(
23        message: String,
24        line_number: u32,
25        source: Box<dyn std::error::Error>,
26    ) -> Error {
27        Error {
28            line: line_number,
29            message,
30            source: Some(source),
31        }
32    }
33}
34
35impl From<Error> for String {
36    fn from(error: Error) -> Self {
37        error.message
38    }
39}
40
41impl fmt::Display for Error {
42    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43        write!(f, "{}", self.message)
44    }
45}
46
47impl std::error::Error for Error {
48    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
49        self.source.as_deref()
50    }
51}
52
53pub fn attribute_outside_field<T: Locale>(line_number: u32, line: &str) -> Error {
54    Error::new(T::attribute_outside_field(line_number, line), line_number)
55}
56
57pub fn attribute_without_key<T: Locale>(line_number: u32, line: &str) -> Error {
58    Error::new(T::attribute_without_key(line_number, line), line_number)
59}
60
61pub fn embed_without_key<T: Locale>(line_number: u32, line: &str) -> Error {
62    Error::new(T::embed_without_key(line_number, line), line_number)
63}
64
65pub fn escape_without_key<T: Locale>(line_number: u32, line: &str) -> Error {
66    Error::new(T::escape_without_key(line_number, line), line_number)
67}
68
69pub fn field_without_key<T: Locale>(line_number: u32, line: &str) -> Error {
70    Error::new(T::field_without_key(line_number, line), line_number)
71}
72
73pub fn invalid_after_escape<T: Locale>(line_number: u32, line: &str) -> Error {
74    Error::new(T::invalid_after_escape(line_number, line), line_number)
75}
76
77pub fn item_outside_field<T: Locale>(line_number: u32, line: &str) -> Error {
78    Error::new(T::item_outside_field(line_number, line), line_number)
79}
80
81pub fn mixed_field_content<T: Locale>(line_number: u32) -> Error {
82    Error::new(T::mixed_field_content(line_number), line_number)
83}
84
85pub fn section_level_skip<T: Locale>(line_number: u32, line: &str) -> Error {
86    Error::new(T::section_level_skip(line_number, line), line_number)
87}
88
89pub fn section_without_key<T: Locale>(line_number: u32, line: &str) -> Error {
90    Error::new(T::section_without_key(line_number, line), line_number)
91}
92
93pub fn unterminated_embed<T: Locale>(key: &str, line_number: u32) -> Error {
94    Error::new(T::unterminated_embed(key, line_number), line_number)
95}
96
97pub fn unterminated_escaped_key<T: Locale>(line_number: u32, line: &str) -> Error {
98    Error::new(T::unterminated_escaped_key(line_number, line), line_number)
99}