soft/
error.rs

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 {}