aldrin_parser/error/
duplicate_definition.rs1use 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}