aldrin_parser/error/
expected_ident_found_reserved.rs1use super::Error;
2use crate::ast::Ident;
3use crate::diag::{Diagnostic, DiagnosticKind, Formatted, Formatter};
4use crate::validate::Validate;
5use crate::Parsed;
6
7const RESERVED: &[&str] = &[
8 "bool",
9 "box",
10 "bytes",
11 "const",
12 "enum",
13 "event",
14 "f32",
15 "f64",
16 "fn",
17 "i16",
18 "i32",
19 "i64",
20 "i8",
21 "import",
22 "lifetime",
23 "map",
24 "object_id",
25 "option",
26 "receiver",
27 "required",
28 "result",
29 "sender",
30 "service",
31 "service_id",
32 "set",
33 "string",
34 "struct",
35 "u16",
36 "u32",
37 "u64",
38 "u8",
39 "unit",
40 "uuid",
41 "value",
42 "vec",
43];
44
45#[derive(Debug)]
46pub struct ExpectedIdentFoundReserved {
47 schema_name: String,
48 ident: Ident,
49}
50
51impl ExpectedIdentFoundReserved {
52 pub(crate) fn validate(ident: &Ident, validate: &mut Validate) {
53 if RESERVED.contains(&ident.value()) {
54 validate.add_error(Self {
55 schema_name: validate.schema_name().to_owned(),
56 ident: ident.clone(),
57 });
58 }
59 }
60
61 pub fn ident(&self) -> &Ident {
62 &self.ident
63 }
64}
65
66impl Diagnostic for ExpectedIdentFoundReserved {
67 fn kind(&self) -> DiagnosticKind {
68 DiagnosticKind::Error
69 }
70
71 fn schema_name(&self) -> &str {
72 &self.schema_name
73 }
74
75 fn format<'a>(&'a self, parsed: &'a Parsed) -> Formatted<'a> {
76 let mut fmt = Formatter::new(
77 self,
78 format!(
79 "expected identifer; found reserved name `{}`",
80 self.ident.value()
81 ),
82 );
83
84 if let Some(schema) = parsed.get_schema(&self.schema_name) {
85 fmt.main_block(
86 schema,
87 self.ident.span().from,
88 self.ident.span(),
89 "identifier expected here",
90 );
91 }
92
93 fmt.note(format!(
94 "the name `{}` is reserved and cannot be used as an identifer",
95 self.ident.value()
96 ));
97
98 fmt.format()
99 }
100}
101
102impl From<ExpectedIdentFoundReserved> for Error {
103 fn from(e: ExpectedIdentFoundReserved) -> Self {
104 Self::ExpectedIdentFoundReserved(e)
105 }
106}