1use std::fmt;
2
3#[derive(Default, Debug, PartialEq, Eq, Clone)]
4pub struct ErrorBuilder {
5 message: Option<String>,
6 file: Option<&'static str>,
7 line: Option<u32>,
8 column: Option<u32>,
9}
10
11impl ErrorBuilder {
12 pub fn new() -> Self {
13 Self::default()
14 }
15
16 pub fn message(mut self, message: String) -> Self {
17 self.message = Some(message);
18 self
19 }
20
21 pub fn file(mut self, file: &'static str) -> Self {
22 self.file = Some(file);
23 self
24 }
25
26 pub fn line(mut self, line: u32) -> Self {
27 self.line = Some(line);
28 self
29 }
30
31 pub fn column(mut self, column: u32) -> Self {
32 self.column = Some(column);
33 self
34 }
35
36 pub fn build(self) -> Error {
37 Error {
38 message: self.message,
39 file: self.file.expect("File name required."),
40 line: self.line.expect("Line number required."),
41 column: self.column.expect("Column number required."),
42 }
43 }
44}
45
46#[derive(Debug, PartialEq, Eq, Clone)]
47pub struct Error {
48 message: Option<String>,
49 file: &'static str,
50 line: u32,
51 column: u32,
52}
53
54impl Error {
55 pub fn message(&self) -> Option<&str> {
56 self.message.as_ref().map(|message| message.as_str())
57 }
58}
59
60impl fmt::Display for Error {
61 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62 if let Some(message) = &self.message {
63 write!(f, "A soft assertion error occured in {}, line {}: {}", self.file, self.line, message)
64 } else {
65 write!(f, "A soft assertion error occured in {}, line {}.", self.file, self.line)
66 }
67 }
68}
69
70impl std::error::Error for Error {}