1use std::ops::Range;
4
5use thiserror::Error;
6
7#[derive(Debug, Error)]
9pub enum ParserError {
10 #[error("Failed to open file!")]
12 IOError(
13 #[from]
14 #[source]
15 std::io::Error,
16 ),
17
18 #[error("Failed to open file! File '{0}' might not exist?")]
19 FileError(String),
20
21 #[error("Unexpected token starting at position {}! Expected: {expected}!", .span.start + 1)]
22 TokenError {
23 span: Range<usize>,
24 expected: String,
25 },
26
27 #[error("Unexpected token starting at {filename}:{}:{}! Expected {expected}!", .line+1, .span.start + 1, )]
28 TokenErrorFile {
29 span: Range<usize>,
30 expected: String,
31 line: usize,
32 filename: String,
33 },
34
35 #[error{"Constraint ID parsing error!"}]
36 ParseIntError(
37 #[from]
38 #[source]
39 std::num::ParseIntError,
40 ),
41
42 #[error("The file did not contain a header, which is required for this input file format!")]
43 NoHeader,
44}
45
46impl ParserError {
47 pub fn token_error(span: Range<usize>, expected: &str) -> Self {
48 Self::TokenError {
49 span,
50 expected: expected.to_string(),
51 }
52 }
53
54 pub fn token_error_with_file(
55 span: Range<usize>,
56 expected: &str,
57 filename: String,
58 line: usize,
59 ) -> Self {
60 Self::TokenErrorFile {
61 span,
62 expected: expected.to_string(),
63 line,
64 filename,
65 }
66 }
67
68 pub fn add_file_and_line(self, filename: String, line: usize) -> Option<Self> {
69 match self {
70 Self::TokenError { span, expected } => Some(Self::TokenErrorFile {
71 span,
72 expected,
73 line,
74 filename,
75 }),
76 _ => None,
77 }
78 }
79}