use std::io; use biome_console::{fmt, markup, ConsoleExt, EnvConsole}; use biome_diagnostics::{ Advices, Diagnostic, Location, LogCategory, PrintDiagnostic, Resource, SourceCode, Visit, }; use biome_rowan::{TextRange, TextSize}; #[derive(Debug, Diagnostic)] #[diagnostic(category = "args/fileNotFound", message = "No matching files found")] struct NotFoundDiagnostic { #[location(resource)] path: String, #[advice] advices: NotFoundAdvices, } #[derive(Debug)] struct NotFoundAdvices { pattern_list: Vec, configuration_path: String, configuration_span: TextRange, configuration_source_code: String, } impl Advices for NotFoundAdvices { fn record(&self, visitor: &mut dyn Visit) -> io::Result<()> { visitor.record_log(LogCategory::Info, &"The following files were ignored")?; let pattern_list: Vec<_> = self .pattern_list .iter() .map(|pattern| pattern as &dyn fmt::Display) .collect(); visitor.record_list(&pattern_list)?; visitor.record_log(LogCategory::Info, &"Ignore patterns were defined here")?; visitor.record_frame(Location { resource: Some(Resource::File(&self.configuration_path)), span: Some(self.configuration_span), source_code: Some(SourceCode { text: &self.configuration_source_code, line_starts: None, }), }) } } pub fn main() { let diag = NotFoundDiagnostic { path: String::from("dist/bundle.js"), advices: NotFoundAdvices { pattern_list: vec![String::from("dist/**/*.js"), String::from("build/**/*.js")], configuration_path: String::from("biome.json"), configuration_span: TextRange::new(TextSize::from(29), TextSize::from(106)), configuration_source_code: String::from( "{ \"formatter\": { \"ignore\": [ \"dist/**/*.js\", \"build/**/*.js\" ] } }", ), }, }; EnvConsole::default().error(markup!({ PrintDiagnostic::verbose(&diag) })); }