diff options
Diffstat (limited to 'src/reports/mod.rs')
-rw-r--r-- | src/reports/mod.rs | 73 |
1 files changed, 35 insertions, 38 deletions
diff --git a/src/reports/mod.rs b/src/reports/mod.rs index bbddba9..9fc5e27 100644 --- a/src/reports/mod.rs +++ b/src/reports/mod.rs @@ -10,53 +10,52 @@ pub use unused_symbols::*; use crate::*; -pub use log::LogLevel; -pub use ansi::*; - pub fn report_source_issue(level: LogLevel, context: &Context, message: &str) { - let mut reporter = SourceIssueReporter::new(context, message, level); + let mut reporter = SourceIssueReporter::new(context, level); reporter.format_source_span(context.source); - let string = reporter.output; + let details = reporter.details; // Print the completed message. match level { - LogLevel::Info => log::info!( "{string}"), - LogLevel::Warn => log::warn!( "{string}"), - LogLevel::Error => log::error!("{string}"), - LogLevel::Fatal => log::fatal!("{string}"), + LogLevel::Info => log_info(message, Some(details)), + LogLevel::Warn => log_warn(message, Some(details)), + LogLevel::Error => log_error(message, Some(details)), + LogLevel::Fatal => log_fatal(message, Some(details)), } } struct SourceIssueReporter<'a> { context: &'a Context<'a>, - output: String, + details: InkedString, level: LogLevel, digits: usize, } impl<'a> SourceIssueReporter<'a> { - pub fn new(context: &'a Context<'a>, message: &str, level: LogLevel) -> Self { - let output = format!("{message}\n"); + pub fn new(context: &'a Context<'a>, level: LogLevel) -> Self { + let details = InkedString::new(); let digits = get_end_line_number(context.source).to_string().len(); - Self { context, level, output, digits } + Self { context, level, details, digits } } pub fn format_source_span(&mut self, source: &SourceSpan) { let colour = match self.level { - LogLevel::Info => BLUE, - LogLevel::Warn => YELLOW, - LogLevel::Error => RED, - LogLevel::Fatal => RED, + LogLevel::Info => Colour::Blue, + LogLevel::Warn => Colour::Yellow, + LogLevel::Error => Colour::Red, + LogLevel::Fatal => Colour::Red, }; // Print location line. - self.output.push_str(NORMAL); let arrow = "-->"; + let w = self.digits + 3; + self.details.push(ink!("{arrow:>w$} ").blue()); let location = source.location(); - self.push(&format!("{BLUE}{arrow:>w$}{NORMAL} {location}\n", w=self.digits+3)); + self.details.push(ink!("{location}\n")); + // Print each source line. let line_count = location.end.line - location.start.line + 1; for line_i in 0..line_count { let merged_i = source.in_merged.start.line + line_i; @@ -74,25 +73,30 @@ impl<'a> SourceIssueReporter<'a> { }; // Print source code line. - self.push(&format!("{BLUE} {line_num:>w$} | {NORMAL}", line_num=location_i+1, w=self.digits)); + let line_num = location_i + 1; + let w = self.digits; + self.details.push(ink!(" {line_num:>w$} | ").blue()); + let mut line_colour = None; for (i, c) in source_line.chars().enumerate() { - if i == left { self.output.push_str(colour) } - if i == right { self.output.push_str(NORMAL) } - self.output.push(c); + if i == left { line_colour = Some(colour) } + if i == right { line_colour = None } + self.details.push(ink!("{c}").set_colour(line_colour)); } - self.output.push_str(NORMAL); - self.output.push('\n'); + self.details.push(ink!("\n")); // Print an underline on the final line. if line_i + 1 == line_count { // Print source code underline. let space = " "; - self.push(&format!("{BLUE} {space:>w$} | {NORMAL}", w=self.digits)); - for _ in 0..left { self.output.push_str(" "); } - self.output.push_str(colour); - for _ in left..right { self.output.push_str("^"); } - self.output.push_str(NORMAL); - self.output.push('\n'); + let w = self.digits; + self.details.push(ink!(" {space:>w$} | ").blue()); + for _ in 0..left { + self.details.push(ink!(" ")); + } + for _ in left..right { + self.details.push(ink!("^").set_colour(Some(colour))); + } + self.details.push(ink!("\n")); } } @@ -100,13 +104,6 @@ impl<'a> SourceIssueReporter<'a> { if let Some(child) = &source.child { self.format_source_span(&child); } - - // Remove the trailing new-line. - self.output.pop(); - } - - fn push(&mut self, string: &str) { - self.output.push_str(&string); } } |