summaryrefslogtreecommitdiff
path: root/src/reports/mod.rs
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-04-27 12:38:40 +1200
committerBen Bridle <ben@derelict.engineering>2025-04-27 12:38:40 +1200
commitc13c1f2748598343e01128c3f734df309aa4a26d (patch)
tree0fdef6bbdac5e32031ea90146ad030d4892e260a /src/reports/mod.rs
parent55e64d35273a425b52b7d913b9368af2f0370bbb (diff)
downloadassembler-c13c1f2748598343e01128c3f734df309aa4a26d.zip
Replace ansi library with inked library
The inked library handles colours correctly on Windows. The log library has also been updated to the newer version which uses inked internally.
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);
}
}