use std::{cmp::Ordering, fmt::Arguments, result::Result as StdResult, str::FromStr};
use tectonic_errors::Error;
pub mod plain;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum MessageKind {
Note,
Warning,
Error,
}
#[repr(usize)]
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Default, Eq)]
pub enum ChatterLevel {
Minimal = 0,
#[default]
Normal,
}
impl ChatterLevel {
pub fn suppress_message(&self, kind: MessageKind) -> bool {
match self {
ChatterLevel::Normal => false,
ChatterLevel::Minimal => kind == MessageKind::Note,
}
}
}
impl FromStr for ChatterLevel {
type Err = &'static str;
fn from_str(a_str: &str) -> StdResult<Self, Self::Err> {
match a_str {
"default" => Ok(ChatterLevel::Normal),
"minimal" => Ok(ChatterLevel::Minimal),
_ => Err("unsupported or unknown chatter level"),
}
}
}
impl PartialEq for ChatterLevel {
#[inline]
fn eq(&self, other: &ChatterLevel) -> bool {
*self as usize == *other as usize
}
}
impl PartialOrd for ChatterLevel {
#[inline]
fn partial_cmp(&self, other: &ChatterLevel) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for ChatterLevel {
#[inline]
fn cmp(&self, other: &ChatterLevel) -> Ordering {
(*self as usize).cmp(&(*other as usize))
}
}
pub trait StatusBackend {
fn report(&mut self, kind: MessageKind, args: Arguments, err: Option<&Error>);
fn report_error(&mut self, err: &Error) {
self.report(
MessageKind::Error,
format_args!("an error occurred"),
Some(err),
)
}
fn note_highlighted(&mut self, before: &str, highlighted: &str, after: &str) {
self.report(
MessageKind::Note,
format_args!("{before}{highlighted}{after}"),
None,
)
}
fn dump_error_logs(&mut self, output: &[u8]);
}
#[macro_export]
macro_rules! tt_note {
($dest:expr, $( $fmt_args:expr ),*) => {
$dest.report($crate::MessageKind::Note, format_args!($( $fmt_args ),*), None)
};
($dest:expr, $( $fmt_args:expr ),* ; $err:expr) => {
$dest.report($crate::MessageKind::Note, format_args!($( $fmt_args ),*), Some(&$err))
};
}
#[macro_export]
macro_rules! tt_warning {
($dest:expr, $( $fmt_args:expr ),*) => {
$dest.report($crate::MessageKind::Warning, format_args!($( $fmt_args ),*), None)
};
($dest:expr, $( $fmt_args:expr ),* ; $err:expr) => {
$dest.report($crate::MessageKind::Warning, format_args!($( $fmt_args ),*), Some(&$err))
};
}
#[macro_export]
macro_rules! tt_error {
($dest:expr, $( $fmt_args:expr ),*) => {
$dest.report($crate::MessageKind::Error, format_args!($( $fmt_args ),*), None)
};
($dest:expr, $( $fmt_args:expr ),* ; $err:expr) => {
$dest.report($crate::MessageKind::Error, format_args!($( $fmt_args ),*), Some(&$err))
};
}
#[derive(Copy, Clone, Debug, Default)]
pub struct NoopStatusBackend {}
impl StatusBackend for NoopStatusBackend {
fn report(&mut self, _kind: MessageKind, _args: Arguments, _err: Option<&Error>) {}
fn dump_error_logs(&mut self, _output: &[u8]) {}
}