pub mod plain;
pub mod termcolor;
use std::cmp;
use std::fmt::Arguments;
use std::result::Result as StdResult;
use std::str::FromStr;
use crate::errors::Error;
#[repr(usize)]
#[derive(Clone, Copy, Eq, Debug)]
pub enum ChatterLevel {
Minimal = 0,
Normal,
}
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<cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for ChatterLevel {
#[inline]
fn cmp(&self, other: &ChatterLevel) -> cmp::Ordering {
(*self as usize).cmp(&(*other as usize))
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum MessageKind {
Note,
Warning,
Error,
}
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::status::MessageKind::Note, format_args!($( $fmt_args ),*), None)
};
($dest:expr, $( $fmt_args:expr ),* ; $err:expr) => {
$dest.report($crate::status::MessageKind::Note, format_args!($( $fmt_args ),*), Some(&$err))
};
}
#[macro_export]
macro_rules! tt_warning {
($dest:expr, $( $fmt_args:expr ),*) => {
$dest.report($crate::status::MessageKind::Warning, format_args!($( $fmt_args ),*), None)
};
($dest:expr, $( $fmt_args:expr ),* ; $err:expr) => {
$dest.report($crate::status::MessageKind::Warning, format_args!($( $fmt_args ),*), Some(&$err))
};
}
#[macro_export]
macro_rules! tt_error {
($dest:expr, $( $fmt_args:expr ),*) => {
$dest.report($crate::status::MessageKind::Error, format_args!($( $fmt_args ),*), None)
};
($dest:expr, $( $fmt_args:expr ),* ; $err:expr) => {
$dest.report($crate::status::MessageKind::Error, format_args!($( $fmt_args ),*), Some(&$err))
};
}
#[derive(Default)]
pub struct NoopStatusBackend {}
impl NoopStatusBackend {
pub fn new() -> NoopStatusBackend {
Default::default()
}
}
impl StatusBackend for NoopStatusBackend {
fn report(&mut self, _kind: MessageKind, _args: Arguments, _err: Option<&Error>) {}
fn dump_error_logs(&mut self, _output: &[u8]) {}
}