summaryrefslogtreecommitdiff
path: root/src/reports/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/reports/mod.rs')
-rw-r--r--src/reports/mod.rs73
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);
}
}