aldrin_parser/error/
duplicate_definition.rs

1use super::{Error, ErrorKind};
2use crate::ast::Ident;
3use crate::diag::{Diagnostic, DiagnosticKind, Renderer};
4use crate::validate::Validate;
5use crate::{util, Parser, Schema, Span};
6
7#[derive(Debug)]
8pub(crate) struct DuplicateDefinition {
9    schema_name: String,
10    duplicate: Ident,
11    first: Span,
12}
13
14impl DuplicateDefinition {
15    pub(crate) fn validate(schema: &Schema, validate: &mut Validate) {
16        util::find_duplicates(
17            schema.definitions(),
18            |def| def.name().value(),
19            |duplicate, first| {
20                validate.add_error(Self {
21                    schema_name: validate.schema_name().to_owned(),
22                    duplicate: duplicate.name().clone(),
23                    first: first.name().span(),
24                });
25            },
26        );
27    }
28}
29
30impl Diagnostic for DuplicateDefinition {
31    fn kind(&self) -> DiagnosticKind {
32        DiagnosticKind::Error
33    }
34
35    fn schema_name(&self) -> &str {
36        &self.schema_name
37    }
38
39    fn render(&self, renderer: &Renderer, parser: &Parser) -> String {
40        let mut report =
41            renderer.error(format!("duplicate definition `{}`", self.duplicate.value()));
42
43        if let Some(schema) = parser.get_schema(&self.schema_name) {
44            report = report
45                .snippet(schema, self.duplicate.span(), "duplicate definition")
46                .context(schema, self.first, "first defined here");
47        }
48
49        report.render()
50    }
51}
52
53impl From<DuplicateDefinition> for Error {
54    fn from(e: DuplicateDefinition) -> Self {
55        Self {
56            kind: ErrorKind::DuplicateDefinition(e),
57        }
58    }
59}