sbpf_assembler/
errors.rs

1use {crate::define_compile_errors, std::ops::Range};
2
3// labels could be overridden by passing a valid custom_label in the error variant
4// if not provided, the label will use default messages from below
5define_compile_errors! {
6    // Lexical errors
7    InvalidNumber {
8        error = "Invalid number '{number}'",
9        label = "Invalid number",
10        fields = { number: String, span: Range<usize> }
11    },
12    InvalidRegister {
13        error = "Invalid register '{register}'",
14        label = "Invalid register",
15        fields = { register: String, span: Range<usize> }
16    },
17    UnexpectedCharacter {
18        error = "Unexpected character '{character}'",
19        label = "Unexpected character",
20        fields = { character: char, span: Range<usize> }
21    },
22    UnterminatedStringLiteral {
23        error = "Unterminated string literal",
24        label = "Unterminated string literal",
25        fields = { span: Range<usize> }
26    },
27    // Syntactic errors
28    InvalidGlobalDecl {
29        error = "Invalid global declaration",
30        label = "Expected <identifier> for entry label",
31        fields = { span: Range<usize> }
32    },
33    InvalidExternDecl {
34        error = "Invalid extern declaration",
35        label = "Invalid extern declaration",
36        fields = { span: Range<usize> }
37    },
38    InvalidRodataDecl {
39        error = "Invalid rodata declaration",
40        label = "Invalid rodata declaration",
41        fields = { span: Range<usize> }
42    },
43    InvalidEquDecl {
44        error = "Invalid equ declaration",
45        label = "Invalid equ declaration",
46        fields = { span: Range<usize> }
47    },
48    InvalidDirective {
49        error = "Invalid directive '{directive}'",
50        label = "Invalid directive",
51        fields = { directive: String, span: Range<usize> }
52    },
53    InvalidInstruction {
54        error = "Invalid '{instruction}' instruction",
55        label = "Invalid instruction",
56        fields = { instruction: String, span: Range<usize> }
57    },
58    UnexpectedToken {
59        error = "Unexpected token '{token}'",
60        label = "Unexpected token",
61        fields = { token: String, span: Range<usize> }
62    },
63    UnmatchedParen {
64        error = "Unmatched parenthesis",
65        label = "Unmatched parenthesis",
66        fields = { span: Range<usize> }
67    },
68    ParseError {
69        error = "Parse error: {error}",
70        label = "Parse error",
71        fields = { error: String, span: Range<usize> }
72    },
73    OutOfRangeLiteral {
74        error = "Out of range literal'",
75        label = "Out of range literal",
76        fields = { span: Range<usize> }
77    },
78    InvalidRODataDirective {
79        error = "Invalid rodata directive",
80        label = "Invalid rodata directive",
81        fields = { span: Range<usize> }
82    },
83    // Semantic errors
84    UndefinedLabel {
85        error = "Undefined label '{label}'",
86        label = "Undefined label",
87        fields = { label: String, span: Range<usize> }
88    },
89    DuplicateLabel {
90        error = "Duplicate label '{label}'",
91        label = "Label redefined",
92        fields = { label: String, span: Range<usize>, original_span: Range<usize> }
93    },
94    BytecodeError {
95        error = "Bytecode error: {error}",
96        label = "Bytecode error",
97        fields = { error: String, span: Range<usize> }
98    },
99    MissingTextDirective {
100        error = "Missing text directive",
101        label = "Missing text directive",
102        fields = { span: Range<usize> }
103    },
104}