1use std::fmt;
2
3use crate::locale::Locale;
4
5#[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}