use colored::Colorize;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OutputLevel {
Info,
Success,
Warning,
Error,
State,
}
impl OutputLevel {
fn color(&self) -> colored::Color {
match self {
OutputLevel::Info => colored::Color::Blue,
OutputLevel::Success => colored::Color::Green,
OutputLevel::Warning => colored::Color::Yellow,
OutputLevel::Error => colored::Color::Red,
OutputLevel::State => colored::Color::Cyan,
}
}
fn label(&self) -> &'static str {
match self {
OutputLevel::Info => "info",
OutputLevel::Success => "success",
OutputLevel::Warning => "warning",
OutputLevel::Error => "error",
OutputLevel::State => "state",
}
}
fn should_error_exit(&self) -> bool {
matches!(self, OutputLevel::Error)
}
}
pub fn print_msg(level: OutputLevel, message: impl AsRef<str>) {
let label = level.label().color(level.color()).bold();
println!("{}: {}", label, message.as_ref());
}
pub fn print_error(message: impl AsRef<str>) {
print_msg(OutputLevel::Error, message);
}
pub fn print_info(message: impl AsRef<str>) {
print_msg(OutputLevel::Info, message);
}
pub fn print_warning(message: impl AsRef<str>) {
print_msg(OutputLevel::Warning, message);
}
pub fn print_success(message: impl AsRef<str>) {
print_msg(OutputLevel::Success, message);
}
pub fn print_state(message: impl AsRef<str>) {
print_msg(OutputLevel::State, message);
}
pub fn exit_with_msg(level: OutputLevel, message: impl AsRef<str>, lowercase: bool) -> ! {
let msg = if lowercase {
message.as_ref().to_lowercase()
} else {
message.as_ref().to_string()
};
let label = level.label().color(level.color()).bold();
println!("{}: {}", label, msg);
let exit_code = if level.should_error_exit() { 1 } else { 0 };
std::process::exit(exit_code);
}
pub fn exit_info(message: impl AsRef<str>) -> ! {
exit_with_msg(OutputLevel::Info, message, true);
}
pub fn exit_error(message: impl AsRef<str>) -> ! {
exit_with_msg(OutputLevel::Error, message, true);
}
#[deprecated(since = "0.1.0", note = "Use print_error function instead")]
#[allow(unused_macros)]
#[macro_export]
macro_rules! print_error {
($arg:tt) => {
$crate::tools::macros::print_error($arg)
};
($($arg:tt)*) => {
$crate::tools::macros::print_error(&format!($($arg)*))
};
}
#[deprecated(since = "0.1.0", note = "Use print_info function instead")]
#[allow(unused_macros)]
#[macro_export]
macro_rules! print_info {
($arg:tt) => {
$crate::tools::macros::print_info($arg)
};
($($arg:tt)*) => {
$crate::tools::macros::print_info(&format!($($arg)*))
};
}
#[deprecated(since = "0.1.0", note = "Use print_warning function instead")]
#[allow(unused_macros)]
#[macro_export]
macro_rules! print_warning {
($arg:tt) => {
$crate::tools::macros::print_warning($arg)
};
($($arg:tt)*) => {
$crate::tools::macros::print_warning(&format!($($arg)*))
};
}
#[deprecated(since = "0.1.0", note = "Use print_success function instead")]
#[allow(unused_macros)]
#[macro_export]
macro_rules! print_success {
($arg:tt) => {
$crate::tools::macros::print_success($arg)
};
($($arg:tt)*) => {
$crate::tools::macros::print_success(&format!($($arg)*))
};
}
#[deprecated(since = "0.1.0", note = "Use print_state function instead")]
#[allow(unused_macros)]
#[macro_export]
macro_rules! print_state {
($arg:tt) => {
$crate::tools::macros::print_state($arg)
};
($($arg:tt)*) => {
$crate::tools::macros::print_state(&format!($($arg)*))
};
}
#[deprecated(since = "0.1.0", note = "Use exit_info function instead")]
#[allow(unused_macros)]
#[macro_export]
macro_rules! exit_info {
($arg:tt) => {
$crate::tools::macros::exit_info($arg)
};
($($arg:tt)*) => {
$crate::tools::macros::exit_info(&format!($($arg)*))
};
}
#[deprecated(since = "0.1.0", note = "Use exit_error function instead")]
#[allow(unused_macros)]
#[macro_export]
macro_rules! exit_error {
($arg:tt) => {
$crate::tools::macros::exit_error($arg)
};
($($arg:tt)*) => {
$crate::tools::macros::exit_error(&format!($($arg)*))
};
}