source-span 2.2.1

Source code mapping and display utilities.
Documentation
use source_span::{
	fmt::{Color, Formatter, Style},
	Position, Span,
};

#[derive(Clone, Default)]
pub struct Token {
	string: String,
	span: Span,
}

#[derive(PartialEq)]
pub enum Kind {
	Space,
	Separator,
	Alphabetic,
	Numeric,
}

const SOURCE: &'static str = "################################
################################
################################
################################
################################
################################
################################
################################
################################
################################";

fn safe_char(c: char) -> Result<char, ()> {
	Ok(c)
}

fn main() {
	let metrics = source_span::DEFAULT_METRICS;
	let span = Span::of_string(SOURCE, &metrics);
	let mut fmt = Formatter::with_margin_color(Color::Blue);

	fmt.add(span, Some("label Z".to_string()), Style::Error);

	fmt.add(
		Span::new(Position::new(1, 8), Position::new(7, 8), Position::new(7, 9)),
		Some("label A\nwith\nmany\nlines\n...".to_string()),
		Style::Note
	);

	fmt.add(
		Span::new(Position::new(1, 4), Position::new(7, 4), Position::new(7, 5)),
		Some("label B".to_string()),
		Style::Warning
	);

	fmt.add(
		Span::new(Position::new(3, 0), Position::new(5, 4), Position::new(5, 5)),
		Some("label C".to_string()),
		Style::Help
	);

	fmt.add(
		Span::new(Position::new(3, 0), Position::new(5, 4), Position::new(5, 5)),
		Some("label D".to_string()),
		Style::Error
	);

	fmt.add(
		Span::new(Position::new(3, 5), Position::new(3, 12), Position::new(3, 13)),
		Some("label E".to_string()),
		Style::Note
	);

	fmt.add(
		Span::new(Position::new(3, 25), Position::new(6, 12), Position::new(6, 13)),
		Some("label F".to_string()),
		Style::Warning
	);

	fmt.add(
		Span::new(Position::new(8, 0), Position::new(8, 31), Position::new(9, 0)),
		Some("label G".to_string()),
		Style::Warning
	);

	let formatted = fmt.render(SOURCE.chars().map(safe_char), span, &metrics).unwrap();
	println!("{}", formatted);
}