mod section;
pub use section::{Document, Location, Section};
mod point_at_file;
mod point_at_single_line;
mod title;
pub enum IncludeFilename {
Always,
Never,
OnlyIfTheFilenameIsARealFile,
}
pub struct SpannedErrorMessage {
pub max_length: usize,
pub minimum_start_distance: usize,
pub include_filename: IncludeFilename,
pub title_prefix: String,
pub title_message: Option<String>,
}
impl Default for SpannedErrorMessage {
fn default() -> Self {
Self::new()
}
}
impl SpannedErrorMessage {
pub fn new() -> Self {
Self {
max_length: 120,
minimum_start_distance: 8,
include_filename: IncludeFilename::OnlyIfTheFilenameIsARealFile,
title_prefix: "error".into(),
title_message: None,
}
}
pub fn minimum_start_distance(&mut self, minimum_start_distance: usize) -> &mut Self {
self.minimum_start_distance = minimum_start_distance;
self
}
pub fn max_length(&mut self, max_length: usize) -> &mut Self {
self.max_length = max_length;
self
}
pub fn always_include_filename(&mut self) -> &mut Self {
self.include_filename = IncludeFilename::Always;
self
}
pub fn never_include_filename(&mut self) -> &mut Self {
self.include_filename = IncludeFilename::Never;
self
}
pub fn sometimes_include_filename(&mut self) -> &mut Self {
self.include_filename = IncludeFilename::OnlyIfTheFilenameIsARealFile;
self
}
pub fn title_prefix(&mut self, title_prefix: impl Into<String>) -> &mut Self {
self.title_prefix = title_prefix.into();
self
}
pub fn title(&mut self, title_message: impl Into<String>) -> &mut Self {
self.title_message = Some(title_message.into());
self
}
pub fn no_title_message(&mut self) -> &mut Self {
self.title_message = None;
self
}
pub fn create(&self, span: &Section) -> String {
[
title::title(self),
point_at_file::point_at_file(span, self),
Some(point_at_single_line::point_at_single_line(span, self)),
]
.into_iter()
.filter_map(|x| x)
.reduce(|mut acc, x| {
acc.push('\n');
acc.push_str(&x);
acc
})
.unwrap_or(String::new())
}
}