use { crate::{ config::error::SpannedError, toml::{ toml_parser::{ErrorHandler, ParserError}, toml_span::{Span, Spanned}, }, }, ahash::AHashSet, error_reporter::Report, std::{cell::RefCell, convert::Infallible, error::Error}, }; pub struct Context<'a> { pub input: &'a [u8], pub used: RefCell, } #[derive(Default)] pub struct Used { pub outputs: Vec>, pub inputs: Vec>, pub drm_devices: Vec>, pub keymaps: Vec>, pub defined_outputs: AHashSet>, pub defined_inputs: AHashSet>, pub defined_drm_devices: AHashSet>, pub defined_keymaps: AHashSet>, } impl<'a> Context<'a> { pub fn error(&self, cause: Spanned) -> SpannedError<'a, E> { self.error2(cause.span, cause.value) } pub fn error2(&self, span: Span, cause: E) -> SpannedError<'a, E> { SpannedError { input: self.input.into(), span, cause: Some(cause), } } pub fn error3(&self, span: Span) -> SpannedError<'a, Infallible> { SpannedError { input: self.input.into(), span, cause: None, } } } impl<'a> ErrorHandler for Context<'a> { fn handle(&self, err: Spanned) { log::warn!("{}", Report::new(self.error(err))); } fn redefinition(&self, err: Spanned, prev: Span) { log::warn!("{}", Report::new(self.error(err))); log::info!( "Previous definition here: {}", Report::new(self.error3(prev)) ); } }