pub use std::io::{self, Write};
pub use textwrap::Options as Textwrap_Options;
pub use textwrap::fill as Textwrap_Fill;
#[derive(Debug, Clone, Copy)]
pub enum CliLevel {
Send,
SendLn,
Info,
Warn,
Error,
Debug,
Trace,
}
pub fn cli_log(level: CliLevel, text: &str, args: &[String]) {
let wrapped = format_wrapped(text, args, None);
match level {
CliLevel::Send => {
print!("{}", wrapped);
}
CliLevel::SendLn => {
println!("{}", wrapped);
}
_other => {
#[cfg(feature = "log")]
match other {
CliLevel::Info => log::info!("{}", text),
CliLevel::Warn => log::warn!("{}", text),
CliLevel::Error => log::error!("{}", text),
CliLevel::Debug => log::debug!("{}", text),
CliLevel::Trace => log::trace!("{}", text),
_ => {}
}
println!("{}", wrapped);
}
}
io::stdout().flush().unwrap();
}
fn format_wrapped(text: &str, args: &[String], prefix: Option<&str>) -> String {
let mut text = text.to_string();
for arg in args {
text = text.replacen("{}", arg, 1);
}
if let Some(prefix) = prefix {
text = format!("{}{}", prefix, text);
}
Textwrap_Fill(&text, Textwrap_Options::new(75))
}
#[macro_export]
macro_rules! cli_send {
($text:expr) => { $crate::cli_log($crate::CliLevel::Send, $text, &[]) };
($text:expr, $( $arg:expr ),*) => {{
let mut args = vec![];
$( args.push($arg.to_string()); )*
$crate::cli_log($crate::CliLevel::Send, $text, &args)
}};
}
#[macro_export]
macro_rules! cli_sendln {
($text:expr) => { $crate::cli_log($crate::CliLevel::SendLn, $text, &[]) };
($text:expr, $( $arg:expr ),*) => {{
let mut args = vec![];
$( args.push($arg.to_string()); )*
$crate::cli_log($crate::CliLevel::SendLn, $text, &args)
}};
}
#[macro_export]
macro_rules! cli_info {
($text:expr) => { $crate::cli_log($crate::CliLevel::Info, $text, &[]) };
($text:expr, $( $arg:expr ),*) => {{
let mut args = vec![];
$( args.push($arg.to_string()); )*
$crate::cli_log($crate::CliLevel::Info, $text, &args)
}};
}
#[macro_export]
macro_rules! cli_warn {
($text:expr) => { $crate::cli_log($crate::CliLevel::Warn, $text, &[]) };
($text:expr, $( $arg:expr ),*) => {{
let mut args = vec![];
$( args.push($arg.to_string()); )*
$crate::cli_log($crate::CliLevel::Warn, $text, &args)
}};
}
#[macro_export]
macro_rules! cli_error {
($text:expr) => { $crate::cli_log($crate::CliLevel::Error, $text, &[]) };
($text:expr, $( $arg:expr ),*) => {{
let mut args = vec![];
$( args.push($arg.to_string()); )*
$crate::cli_log($crate::CliLevel::Error, $text, &args)
}};
}
#[macro_export]
macro_rules! cli_debug {
($text:expr) => { $crate::cli_log($crate::CliLevel::Debug, $text, &[]) };
($text:expr, $( $arg:expr ),*) => {{
let mut args = vec![];
$( args.push($arg.to_string()); )*
$crate::cli_log($crate::CliLevel::Debug, $text, &args)
}};
}
#[macro_export]
macro_rules! cli_trace {
($text:expr) => { $crate::cli_log($crate::CliLevel::Trace, $text, &[]) };
($text:expr, $( $arg:expr ),*) => {{
let mut args = vec![];
$( args.push($arg.to_string()); )*
$crate::cli_log($crate::CliLevel::Trace, $text, &args)
}};
}