Skip to content

Commit

Permalink
Remove chrono dependency
Browse files Browse the repository at this point in the history
  • Loading branch information
seanmonstar committed Jan 29, 2020
1 parent 28c5ad0 commit 693b5e7
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 30 deletions.
1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,3 @@ include = [
[dependencies]
env_logger = "0.7.0"
log = "0.4"
chrono = "0.4.4"
97 changes: 68 additions & 29 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,32 @@
//! error!("boom");
//! }
//! ```
//!
//! Run the program with the environment variable `RUST_LOG=trace`.
//!
//! ## Defaults
//!
//! The defaults can be setup by calling `init()` or `try_init()` at the start
//! of the program.
//!
//! ## Enable logging
//!
//! This crate uses [env_logger][] internally, so the same ways of enabling
//! logs through an environment variable are supported.
//!
//! [env_logger]: https://docs.rs/env_logger

#[doc(hidden)]
pub extern crate env_logger;

extern crate log;
extern crate chrono;

use std::fmt;
use std::sync::atomic::{AtomicUsize, Ordering};

use chrono::Local;
use env_logger::{fmt::{Color, Style, StyledValue}, Builder};
use log::Level;

fn colored_level<'a>(style: &'a mut Style, level: Level) -> StyledValue<'a, &'static str> {
match level {
Level::Trace => style.set_color(Color::Magenta).value("TRACE"),
Level::Debug => style.set_color(Color::Blue).value("DEBUG"),
Level::Info => style.set_color(Color::Green).value("INFO "),
Level::Warn => style.set_color(Color::Yellow).value("WARN "),
Level::Error => style.set_color(Color::Red).value("ERROR"),
}
}

static MAX_MODULE_WIDTH: AtomicUsize = AtomicUsize::new(0);

/// Initializes the global logger with a pretty env logger.
///
Expand All @@ -53,7 +57,6 @@ static MAX_MODULE_WIDTH: AtomicUsize = AtomicUsize::new(0);
/// # Panics
///
/// This function fails to set the global logger if one has already been set.
#[inline]
pub fn init() {
try_init().unwrap();
}
Expand All @@ -67,7 +70,6 @@ pub fn init() {
/// # Panics
///
/// This function fails to set the global logger if one has already been set.
#[inline]
pub fn init_timed() {
try_init_timed().unwrap();
}
Expand Down Expand Up @@ -159,18 +161,19 @@ pub fn formatted_builder() -> Builder {

builder.format(|f, record| {
use std::io::Write;
let target = record.target();
let mut max_width = MAX_MODULE_WIDTH.load(Ordering::Relaxed);
if max_width < target.len() {
MAX_MODULE_WIDTH.store(target.len(), Ordering::Relaxed);
max_width = target.len();
}

let target = record.target();
let max_width = max_target_width(target);

let mut style = f.style();
let level = colored_level(&mut style, record.level());

let mut style = f.style();
let target = style.set_bold(true).value(format!("{: <width$}", target, width=max_width));
let target = style.set_bold(true).value(Padded {
value: target,
width: max_width,
});

writeln!(
f,
" {} {} > {}",
Expand All @@ -194,20 +197,23 @@ pub fn formatted_timed_builder() -> Builder {
builder.format(|f, record| {
use std::io::Write;
let target = record.target();
let mut max_width = MAX_MODULE_WIDTH.load(Ordering::Relaxed);
if max_width < target.len() {
MAX_MODULE_WIDTH.store(target.len(), Ordering::Relaxed);
max_width = target.len();
}
let max_width = max_target_width(target);

let mut style = f.style();
let level = colored_level(&mut style, record.level());

let mut style = f.style();
let target = style.set_bold(true).value(format!("{: <width$}", target, width=max_width));
let target = style.set_bold(true).value(Padded {
value: target,
width: max_width,
});

let time = f.timestamp_millis();

writeln!(
f,
" {} {} {} > {}",
Local::now().format("%Y-%m-%dT%H:%M:%S%.3f"),
time,
level,
target,
record.args(),
Expand All @@ -216,3 +222,36 @@ pub fn formatted_timed_builder() -> Builder {

builder
}

struct Padded<T> {
value: T,
width: usize,
}

impl<T: fmt::Display> fmt::Display for Padded<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{: <width$}", self.value, width=self.width)
}
}

static MAX_MODULE_WIDTH: AtomicUsize = AtomicUsize::new(0);

fn max_target_width(target: &str) -> usize {
let max_width = MAX_MODULE_WIDTH.load(Ordering::Relaxed);
if max_width < target.len() {
MAX_MODULE_WIDTH.store(target.len(), Ordering::Relaxed);
target.len()
} else {
max_width
}
}

fn colored_level<'a>(style: &'a mut Style, level: Level) -> StyledValue<'a, &'static str> {
match level {
Level::Trace => style.set_color(Color::Magenta).value("TRACE"),
Level::Debug => style.set_color(Color::Blue).value("DEBUG"),
Level::Info => style.set_color(Color::Green).value("INFO "),
Level::Warn => style.set_color(Color::Yellow).value("WARN "),
Level::Error => style.set_color(Color::Red).value("ERROR"),
}
}

0 comments on commit 693b5e7

Please sign in to comment.