1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use crate::syntax::{Equality, Ident};
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum RawError {
InvalidUtf8String(std::string::FromUtf8Error),
InvalidInteger(std::num::ParseIntError),
InvalidHexadecimal(String),
UnexpectedChar(Option<u8>, Vec<u8>),
UnexpectedWord(String, Vec<&'static str>),
UndefinedIdent(Ident),
CannotAttachMeaning(Ident),
CannotAttachVarNames(Ident),
UnknownCommand(String),
InvalidEndOfInstance,
InvalidInstanceKey,
InvalidMatchKey,
MissingBody,
InvalidEnodeGeneration,
CannotAttachEnode(usize, usize),
CannotProcessEquality(Ident, Equality),
CannotCheckEquality(Ident, Ident),
}
#[derive(Clone, Eq, PartialEq)]
pub struct Position {
pub path_name: Option<String>,
pub line: usize,
pub column: usize,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Error {
pub position: Position,
pub error: RawError,
}
pub type RawResult<T> = std::result::Result<T, RawError>;
pub type Result<T> = std::result::Result<T, Error>;
impl std::fmt::Debug for Position {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let file = match &self.path_name {
Some(p) => format!("{}:", p),
None => String::new(),
};
write!(f, "{}{}:{}", file, self.line + 1, self.column + 1)
}
}