Skip to main content

veripb_parser/
error.rs

1//! Definitions of parsing errors.
2
3use std::ops::Range;
4
5use thiserror::Error;
6
7/// An error from the VeriPB parsing library.
8#[derive(Debug, Error)]
9pub enum ParserError {
10    /// Error related to reading the file.
11    #[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}