#[macro_export]
macro_rules! impl_diagnostic_from_source_loc_opt_field {
( $($id:ident).+ ) => {
fn source_code(&self) -> Option<&dyn miette::SourceCode> {
self.$($id).+
.as_ref()
.map(|loc| &loc.src as &dyn miette::SourceCode)
}
fn labels(&self) -> Option<Box<dyn Iterator<Item = miette::LabeledSpan> + '_>> {
self.$($id).+
.as_ref()
.map(|loc| Box::new(std::iter::once(miette::LabeledSpan::underline(loc.span))) as _)
}
};
}
#[macro_export]
macro_rules! impl_diagnostic_from_two_source_loc_opt_fields {
( $i:ident , $j:ident ) => {
fn source_code(&self) -> Option<&dyn miette::SourceCode> {
self.$i
.as_ref()
.map(|loc| &loc.src as &dyn miette::SourceCode)
.or_else(|| {
self.$j
.as_ref()
.map(|loc| &loc.src as &dyn miette::SourceCode)
})
}
fn labels(&self) -> Option<Box<dyn Iterator<Item = miette::LabeledSpan> + '_>> {
let x = self
.$i
.as_ref()
.map(|loc| miette::LabeledSpan::underline(loc.span));
let y = self
.$j
.as_ref()
.map(|loc| miette::LabeledSpan::underline(loc.span));
match (x, y) {
(None, None) => None,
(Some(span), None) | (None, Some(span)) => Some(Box::new(std::iter::once(span))),
(Some(span_a), Some(span_b)) => Some(Box::new([span_a, span_b].into_iter()) as _),
}
}
};
}
#[macro_export]
macro_rules! impl_diagnostic_from_method_on_field {
( $i:ident, $m:ident ) => {
fn source_code(&self) -> Option<&dyn miette::SourceCode> {
self.$i
.$m()
.as_ref()
.map(|loc| &loc.src as &dyn miette::SourceCode)
}
fn labels(&self) -> Option<Box<dyn Iterator<Item = miette::LabeledSpan> + '_>> {
self.$i
.$m()
.as_ref()
.map(|loc| Box::new(std::iter::once(miette::LabeledSpan::underline(loc.span))) as _)
}
};
}
#[macro_export]
macro_rules! impl_diagnostic_from_method_on_nonempty_field {
( $i:ident, $m:ident ) => {
fn source_code(&self) -> Option<&dyn miette::SourceCode> {
self.$i
.first()
.$m()
.as_ref()
.map(|loc| &loc.src as &dyn miette::SourceCode)
}
fn labels(&self) -> Option<Box<dyn Iterator<Item = miette::LabeledSpan> + '_>> {
self.$i
.first()
.$m()
.as_ref()
.map(|loc| Box::new(std::iter::once(miette::LabeledSpan::underline(loc.span))) as _)
}
};
}