aldrin_parser/error/
expected_ident_found_reserved.rs

1use 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}