#[cfg(feature = "colour")]
extern crate ansi_term;
#[cfg(feature = "colour")]
use ansi_term::Colour;
#[cfg(not(feature = "colour"))]
enum Colour {
Purple,
Blue,
Yellow,
Red,
}
#[cfg(not(feature = "colour"))]
impl Colour {
fn paint<'l>(&self, level: &'l str) -> &'l str {
level
}
}
use std::io::{self, Write};
#[macro_export]
macro_rules! flm {
() => (concat!(file!(), ":", line!()));
($message:expr) => (concat!(file!(), ":", line!(), ": ", $message));
($format:expr, $( $val:expr ),+) => (
format!(concat!(file!(), ":", line!(), ": ", $format), $( $val ),+)
);
}
#[macro_export]
macro_rules! expect {
($value:expr) => ($value.expect(flm!()));
($value:expr, $message:expr) => ($value.expect(flm!($message)));
}
#[macro_export]
macro_rules! internal {
($message:expr) => ($crate::internal(flm!($message)));
($format:expr, $( $val:expr ),+) => ($crate::internal(&flm!($format, $( $val ),+)));
}
fn print(colour: Colour, level: &str, message: &str) -> io::Result<()> {
let program = try!(std::env::current_exe());
let program = program.file_name().and_then(|n| n.to_str());
match program {
Some(name) => writeln!(
io::stderr(),
"{}:{}: {}",
Colour::Blue.paint(name),
colour.paint(level),
message,
),
None => writeln!(io::stderr(), "{}: {}", colour.paint(level), message),
}
}
pub fn internal(message: &str) -> io::Result<()> {
print(Colour::Red, "internal", message)
}
pub fn fatal(message: &str) -> ! {
print(Colour::Red, "fatal", message).expect("failed to write error message");
panic!("fatal error occurred");
}
pub fn error(message: &str) -> io::Result<()> {
print(Colour::Red, "error", message)
}
pub fn warn(message: &str) -> io::Result<()> {
print(Colour::Yellow, "warning", message)
}
pub fn info(message: &str) -> io::Result<()> {
print(Colour::Purple, "info", message)
}