ergoscript-compiler 0.18.0

Compiler for ErgoScript
Documentation
use line_col::LineColLookup;
use rowan::TextRange;

pub fn pretty_error_desc(source: &str, span: TextRange, error_msg: &str) -> String {
    let line_col_lookup = LineColLookup::new(source);
    let start_zero_based: usize = usize::from(span.start()) - 1;
    let end_zero_based: usize = usize::from(span.end()) - 1;
    let (line_start, col_start) = line_col_lookup.get(start_zero_based);
    let (line_end, col_end) = line_col_lookup.get(end_zero_based);
    if line_end != line_start {
        return "Multiline error spans are not yet supported".to_string();
    }
    let source_line = source.lines().nth(line_start - 1).unwrap();
    let highlight = format!("{0:^>span$}", "^", span = col_end - col_start + 1);
    format!(
        "{0}\nline: {1}\n{2}\n{3:>ident$}",
        error_msg,
        line_start,
        source_line,
        highlight,
        ident = col_start + 1,
    )
}