use crate::*; pub struct Segment { pub address: usize, /// Source of the address value. pub source: Option, pub words: Vec>, } pub fn print_segment(segment: &Segment) { println!("SEGMENT: 0x{:>04x}", segment.address); // Find maximum width of all words in the segment. let width = segment.words.iter().map(|w| w.to_string().chars().count()).max().unwrap_or(0); for word in &segment.words { let string = word.to_string(); println!(" {string:>w$}", w=width as usize); } } pub enum BytecodeError { // (expected, received) IncorrectWidth(u32, u32) } pub fn report_bytecode_errors(errors: &[Tracked], source_code: &str) { for error in errors { report_bytecode_error(error, source_code); } } fn report_bytecode_error(error: &Tracked, source_code: &str) { let context = Context { source_code: &source_code, source: &error.source }; let message = match &error.value { BytecodeError::IncorrectWidth(expected, received) => &format!("Word is {received} bits wide, but should be exactly {expected} bits wide"), }; report_source_issue(LogLevel::Error, &context, message); }