log4rust 0.1.1

A logging system for rust that is trying to be as easy as possiable to impliment
Documentation
#[macro_export]
macro_rules! info {
    ( $( $x:expr ),* ) => {
        {
            log4rust_template!("info", format!($($x,)*));
        }
    };
}

#[macro_export]
macro_rules! warn {
    ( $( $x:expr ),* ) => {
        {
            log4rust_template!("warn", format!($($x,)*));
        }
    };
}

#[macro_export]
macro_rules! error {
    ( $( $x:expr ),* ) => {
        {
            log4rust_template!("error", format!($($x,)*));
        }
    };
}

#[macro_export]
macro_rules! fatal {
    ( $( $x:expr ),* ) => {
        {
            log4rust_template!("fatal", format!($($x,)*));
        }
    };
}

#[macro_export]
#[doc(hidden)]
macro_rules! log4rust_template {
    ( $type:expr, $write:expr ) => {
        {
            use log4rust::Colorize;
            use log4rust::chrono::prelude::*;
            use std::fs::OpenOptions;
            use std::io::Write;
            match log4rust::CONFIG.lock() {
                Ok(config) => {
                    let time = if config.time == Time::UTC {format!("[{}]", Utc::now())}
                    else {format!("[{}]", Local::now())};

                    let text = format!("{} {}", time, $write);
                    
                    let console = match $type {
                        "info" => config.info_console,
                        "warn" => config.warn_console,
                        "error" => config.error_console,
                        _ => config.fatal_console
                    };

                    if console {
                        println!("{}", text.color(match $type {
                            "info" => config.info_color,
                            "warn" => config.warn_color,
                            "error" => config.error_color,
                            _ => config.fatal_color,
                        }));
                    }

                    let web = match $type {
                        "info" => &config.info_web,
                        "warn" => &config.warn_web,
                        "error" => &config.error_web,
                        _ => &config.fatal_web
                    };

                    for (request, format) in web {
                        match request.clone().send_string(&format.replace("{}", &text)) {
                            Ok(_) => {},
                            Err(e) => println!("{}", format!("Failed to send a http request as a {} and wanted to send '{}', Request error: {:?}", $type, text, e).color(config.fatal_color)),
                        }
                    }

                    let file = match $type {
                        "info" => &config.info_file,
                        "warn" => &config.warn_file,
                        "error" => &config.error_file,
                        _ => &config.fatal_file
                    };

                    for i in file {
                        match OpenOptions::new()
                            .create(true)
                            .write(true)
                            .append(true)
                            .open(i) {
                                Ok(mut file) => match writeln!(file, "{}", text) {
                                    Ok(_) => {},
                                    Err(e) => println!("{}", format!("Couldn't write to file: {}, wanted to write '{}' as a {}, error: {:?}", e, text, $type, e).color(config.fatal_color)),
                                },
                                Err(e) => println!("{}", format!("Couldn't create OpenOptions for file {}, wanted to write {} as a {}, error: {:?}", i, text, $type, e).color(config.fatal_color)),
                            }
                    }
                },
                Err(e) => println!("FATAL!!!: Faild to get the config, wanted to make a {} with the text '{}', error: {:?}", $type, format!("[{}] {}", Utc::now(), $write), e),
            }
        }
    };
}