pub mod marks {
pub const INFO: &str = "ℹ️";
pub const WARN: &str = "⚠️";
pub const ERROR: &str = "❌";
pub const SUCCESS: &str = "✅";
pub const WAIT: &str = "⌛";
pub const INPUT: &str = "⌨️";
}
#[cfg(not(test))]
#[macro_export]
macro_rules! custom {
($head:expr, $($arg:tt)*) => { eprint!("{} {}", $head, format_args!($($arg)*)) }
}
#[cfg(test)]
macro_rules! custom {
($head:expr, $($arg:tt)*) => { format!("{} {}", $head, format_args!($($arg)*)) }
}
#[macro_export]
macro_rules! customln {
($head:expr, $($arg:tt)*) => { custom!($head, "{}\n", format_args!($($arg)*)) }
}
#[cfg(not(test))]
#[macro_export]
macro_rules! scopecustom {
($prefix:expr, $head:expr, $($arg:tt)*) => {
eprint!("\u{1b}[2m[{}]\u{1b}[0m {} {}", $prefix, $head, format_args!($($arg)*))
}
}
#[cfg(test)]
macro_rules! scopecustom {
($prefix:expr, $head:expr, $($arg:tt)*) => {
format!("\u{1b}[2m[{}]\u{1b}[0m {} {}", $prefix, $head, format_args!($($arg)*))
}
}
#[macro_export]
macro_rules! scopecustomln {
($prefix:expr, $head:expr, $($arg:tt)*) => {
scopecustom!($prefix, $head, "{}\n", format_args!($($arg)*))
}
}
#[macro_export]
macro_rules! info {
($($arg:tt)*) => { custom!($crate::io::marks::INFO, $($arg)*) }
}
#[macro_export]
macro_rules! infoln {
($($arg:tt)*) => { customln!($crate::io::marks::INFO, $($arg)*) }
}
#[macro_export]
macro_rules! scopeinfo {
($prefix:expr, $($arg:tt)*) => { scopecustom!($prefix, $crate::io::marks::INFO, $($arg)*) }
}
#[macro_export]
macro_rules! scopeinfoln {
($prefix:expr, $($arg:tt)*) => { scopecustomln!($prefix, $crate::io::marks::INFO, $($arg)*) }
}
#[macro_export]
macro_rules! warn {
($($arg:tt)*) => { custom!($crate::io::marks::WARN, $($arg)*) }
}
#[macro_export]
macro_rules! warnln {
($($arg:tt)*) => { customln!($crate::io::marks::WARN, $($arg)*) }
}
#[macro_export]
macro_rules! scopewarn {
($prefix:expr, $($arg:tt)*) => { scopecustom!($prefix, $crate::io::marks::WARN, $($arg)*) }
}
#[macro_export]
macro_rules! scopewarnln {
($prefix:expr, $($arg:tt)*) => { scopecustomln!($prefix, $crate::io::marks::WARN, $($arg)*) }
}
#[macro_export]
macro_rules! success {
($($arg:tt)*) => { custom!($crate::io::marks::SUCCESS, $($arg)*) }
}
#[macro_export]
macro_rules! successln {
($($arg:tt)*) => { customln!($crate::io::marks::SUCCESS, $($arg)*) }
}
#[macro_export]
macro_rules! scopesuccess {
($prefix:expr, $($arg:tt)*) => { scopecustom!($prefix, $crate::io::marks::SUCCESS, $($arg)*) }
}
#[macro_export]
macro_rules! scopesuccessln {
($prefix:expr, $($arg:tt)*) => { scopecustomln!($prefix, $crate::io::marks::SUCCESS, $($arg)*) }
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => { custom!($crate::io::marks::ERROR, $($arg)*) }
}
#[macro_export]
macro_rules! errorln {
($($arg:tt)*) => { customln!($crate::io::marks::ERROR, $($arg)*) }
}
#[macro_export]
macro_rules! scopeerror {
($prefix:expr, $($arg:tt)*) => { scopecustom!($prefix, $crate::io::marks::ERROR, $($arg)*) }
}
#[macro_export]
macro_rules! scopeerrorln {
($prefix:expr, $($arg:tt)*) => { scopecustomln!($prefix, $crate::io::marks::ERROR, $($arg)*) }
}
#[macro_export]
macro_rules! wait {
($($arg:tt)*) => { custom!($crate::io::marks::WAIT, $($arg)*) }
}
#[macro_export]
macro_rules! waitln {
($($arg:tt)*) => { customln!($crate::io::marks::WAIT, $($arg)*) }
}
#[macro_export]
macro_rules! scopewait {
($prefix:expr, $($arg:tt)*) => { scopecustom!($prefix, $crate::io::marks::WAIT, $($arg)*) }
}
#[macro_export]
macro_rules! scopewaitln {
($prefix:expr, $($arg:tt)*) => { scopecustomln!($prefix, $crate::io::marks::WAIT, $($arg)*) }
}
#[macro_export]
macro_rules! input {
($($arg:tt)*) => { custom!($crate::io::marks::INPUT, $($arg)*) }
}
#[macro_export]
macro_rules! inputln {
($($arg:tt)*) => { customln!($crate::io::marks::INPUT, $($arg)*) }
}
#[macro_export]
macro_rules! scopeinput {
($prefix:expr, $($arg:tt)*) => { scopecustom!($prefix, $crate::io::marks::INPUT, $($arg)*) }
}
#[macro_export]
macro_rules! scopeinputln {
($prefix:expr, $($arg:tt)*) => { scopecustomln!($prefix, $crate::io::marks::INPUT, $($arg)*) }
}
#[cfg(test)]
mod tests {
use crate::*;
use super::marks;
#[test]
fn output() {
println!("\nOUTPUTS\n");
print!("{} => same line\n", info!("info"));
print!("{}", infoln!("infoln"));
print!("{} => same line\n", scopeinfo!("scope", "scopeinfo"));
print!("{}", scopeinfoln!("scope", "scopeinfoln"));
print!("{} => same line\n", warn!("warn"));
print!("{}", warnln!("warnln"));
print!("{} => same line\n", scopewarn!("scope", "scopewarn"));
print!("{}", scopewarnln!("scope", "scopewarnln"));
print!("{} => same line\n", success!("success"));
print!("{}", successln!("successln"));
print!("{} => same line\n", scopesuccess!("scope", "scopesuccess"));
print!("{}", scopesuccessln!("scope", "scopesuccessln"));
print!("{} => same line\n", wait!("wait"));
print!("{}", waitln!("waitln"));
print!("{} => same line\n", scopewait!("scope", "scopewait"));
print!("{}", scopewaitln!("scope", "scopewaitln"));
print!("{} => same line\n", error!("error"));
print!("{}", errorln!("errorln"));
print!("{} => same line\n", scopeerror!("scope", "scopeerror"));
print!("{}", scopeerrorln!("scope", "scopeerrorln"));
print!("{} => same line\n", input!("input"));
print!("{}", inputln!("inputln"));
print!("{} => same line\n", scopeinput!("scope", "scopeinput"));
print!("{}", scopeinputln!("scope", "scopeinputln"));
println!("\n");
}
#[test]
fn info() {
assert_eq!(
info!("test info"),
format!("{} test info", marks::INFO)
);
assert_eq!(
infoln!("test infoln"),
format!("{} test infoln\n", marks::INFO)
);
assert_eq!(
scopeinfo!("preinfo", "some formatting {}", 12.333),
format!("\u{1b}[2m[preinfo]\u{1b}[0m {} some formatting 12.333", marks::INFO)
);
assert_eq!(
scopeinfoln!("preinfoln", "some formatting {}", 123),
format!("\u{1b}[2m[preinfoln]\u{1b}[0m {} some formatting 123\n", marks::INFO)
);
}
#[test]
fn warn() {
assert_eq!(
warn!("test warn"),
format!("{} test warn", marks::WARN)
);
assert_eq!(
warnln!("test warnln"),
format!("{} test warnln\n", marks::WARN)
);
assert_eq!(
scopewarn!("prewarn", "some formatting {}", 12.333 ),
format!("\u{1b}[2m[prewarn]\u{1b}[0m {} some formatting 12.333", marks::WARN)
);
assert_eq!(
scopewarnln!("prewarnln", "some formatting {}", 123),
format!("\u{1b}[2m[prewarnln]\u{1b}[0m {} some formatting 123\n", marks::WARN)
);
}
#[test]
fn success() {
assert_eq!(
format!("{} => {}", success!("test success"), "same line"),
format!("{} test success => same line", marks::SUCCESS)
);
assert_eq!(
successln!("test successln"),
format!("{} test successln\n", marks::SUCCESS)
);
assert_eq!(
format!("{} => {}", scopesuccess!("presuccess", "some formatting {}", 12.333), "same line"),
format!("\u{1b}[2m[presuccess]\u{1b}[0m {} some formatting 12.333 => same line", marks::SUCCESS)
);
assert_eq!(
scopesuccessln!("presuccessln", "some formatting {}", 123),
format!("\u{1b}[2m[presuccessln]\u{1b}[0m {} some formatting 123\n", marks::SUCCESS)
);
}
#[test]
fn error() {
assert_eq!(
error!("test error"),
format!("{} test error", marks::ERROR)
);
assert_eq!(
errorln!("test errorln"),
format!("{} test errorln\n", marks::ERROR)
);
assert_eq!(
scopeerror!("preerror", "some formatting {}", 12.333 ),
format!("\u{1b}[2m[preerror]\u{1b}[0m {} some formatting 12.333", marks::ERROR)
);
assert_eq!(
scopeerrorln!("preerrorln", "some formatting {}", 123),
format!("\u{1b}[2m[preerrorln]\u{1b}[0m {} some formatting 123\n", marks::ERROR)
);
}
#[test]
fn wait() {
assert_eq!(
wait!("test wait"),
format!("{} test wait", marks::WAIT)
);
assert_eq!(
waitln!("test waitln"),
format!("{} test waitln\n", marks::WAIT)
);
assert_eq!(
scopewait!("prewait", "some formatting {}", 12.333 ),
format!("\u{1b}[2m[prewait]\u{1b}[0m {} some formatting 12.333", marks::WAIT)
);
assert_eq!(
scopewaitln!("prewaitln", "some formatting {}", 123),
format!("\u{1b}[2m[prewaitln]\u{1b}[0m {} some formatting 123\n", marks::WAIT)
);
}
#[test]
fn input() {
assert_eq!(
input!("test input: "),
format!("{} test input: ", marks::INPUT)
);
assert_eq!(
inputln!("test inputln\n> "),
format!("{} test inputln\n> ", marks::INPUT)
);
assert_eq!(
scopeinput!("preinput", "some formatting {}", 12.333 ),
format!("\u{1b}[2m[preinput]\u{1b}[0m {} some formatting 12.333", marks::INPUT)
);
assert_eq!(
scopeinputln!("preinputln", "some formatting {}", 123),
format!("\u{1b}[2m[preinputln]\u{1b}[0m {} some formatting 123\n", marks::INPUT)
);
}
}