#![warn(missing_docs)]
extern crate crossbeam;
extern crate chrono;
extern crate rustc_serialize as serialize;
#[macro_use]
extern crate error_chain;
use std::sync::Arc;
use std::fmt;
use std::str::FromStr;
use std::ascii::AsciiExt;
#[macro_export]
macro_rules! o(
() => {
vec![]
};
($($k:expr => $v:expr),*) => {
{
use std;
vec![$(($k, std::boxed::Box::new($v))),*]
}
};
);
#[macro_export]
macro_rules! log(
($l:expr, $lvl:expr, $msg:expr) => {
let lvl = $lvl;
if lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
$l.log(
&$crate::RecordInfo::new(
lvl,
&$msg,
file!(),
line!(),
module_path!(),
&[]
)
)
}
};
($l:expr, $lvl:expr, $msg:expr, $($k:expr => $v:expr),*) => {
let lvl = $lvl;
if lvl.as_usize() <= $crate::__slog_static_max_level().as_usize() {
$l.log(
&$crate::RecordInfo::new(
$lvl,
&$msg,
file!(),
line!(),
module_path!(),
&[$(($k, &$v)),*]
)
)
}
};
);
#[macro_export]
macro_rules! slog_log(
($l:expr, $lvl:expr, $msg:expr) => {
$l.log(
&$crate::RecordInfo::new(
$lvl,
&$msg,
file!(),
line!(),
module_path!(),
&[]
)
)
};
($l:expr, $lvl:expr, $msg:expr, $($k:expr => $v:expr),*) => {
$l.log(
&$crate::RecordInfo::new(
$lvl,
&$msg,
file!(),
line!(),
module_path!(),
&[$(($k, &$v)),*]
)
)
};
);
#[macro_export]
macro_rules! crit(
($l:expr, $msg:expr) => {
log!($l, $crate::Level::Critical, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
log!($l, $crate::Level::Critical, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! slog_crit(
($l:expr, $msg:expr) => {
slog_log!($l, $crate::Level::Critical, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
slog_log!($l, $crate::Level::Critical, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! error(
($l:expr, $msg:expr) => {
log!($l, $crate::Level::Error, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
log!($l, $crate::Level::Error, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! slog_error(
($l:expr, $msg:expr) => {
slog_log!($l, $crate::Level::Error, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
slog_log!($l, $crate::Level::Error, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! warn(
($l:expr, $msg:expr) => {
log!($l, $crate::Level::Warning, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
log!($l, $crate::Level::Warning, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! slog_warn(
($l:expr, $msg:expr) => {
slog_log!($l, $crate::Level::Warning, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
slog_log!($l, $crate::Level::Warning, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! info(
($l:expr, $msg:expr) => {
log!($l, $crate::Level::Info, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
log!($l, $crate::Level::Info, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! slog_info(
($l:expr, $msg:expr) => {
slog_log!($l, $crate::Level::Info, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
slog_log!($l, $crate::Level::Info, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! debug(
($l:expr, $msg:expr) => {
log!($l, $crate::Level::Debug, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
log!($l, $crate::Level::Debug, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! slog_debug(
($l:expr, $msg:expr) => {
slog_log!($l, $crate::Level::Debug, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
slog_log!($l, $crate::Level::Debug, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! trace(
($l:expr, $msg:expr) => {
log!($l, $crate::Level::Trace, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
log!($l, $crate::Level::Trace, $msg, $($k => $v),*)
};
);
#[macro_export]
macro_rules! slog_trace(
($l:expr, $msg:expr) => {
slog_log!($l, $crate::Level::Trace, $msg)
};
($l:expr, $msg:expr, $($k:expr => $v:expr),*) => {
slog_log!($l, $crate::Level::Trace, $msg, $($k => $v),*)
};
);
pub mod drain;
pub mod logger;
pub mod ser;
pub mod format;
pub use logger::Logger;
pub use logger::RecordInfo;
pub use ser::{PushLazy, ValueSerializer, Serializer, Serialize};
pub use self::drain::{Error, Result, ErrorKind};
include!("_level.rs");
pub type OwnedKeyValue = (&'static str, Box<ser::SyncSerialize>);
pub type BorrowedKeyValue<'a> = (&'static str, &'a ser::Serialize);
pub struct OwnedKeyValueNode {
parent: Option<Arc<OwnedKeyValueNode>>,
values: Vec<OwnedKeyValue>,
}
impl OwnedKeyValueNode {
pub fn new(values: Vec<OwnedKeyValue>, parent: Arc<OwnedKeyValueNode>) -> Self {
OwnedKeyValueNode {
parent: Some(parent),
values: values,
}
}
pub fn new_root(values: Vec<OwnedKeyValue>) -> Self {
OwnedKeyValueNode {
parent: None,
values: values,
}
}
pub fn iter(&self) -> OwnedKeyValueNodeIterator {
OwnedKeyValueNodeIterator::new(self)
}
}
pub struct OwnedKeyValueNodeIterator<'a> {
next_node: &'a Option<Arc<OwnedKeyValueNode>>,
iter: std::slice::Iter<'a, OwnedKeyValue>,
}
impl<'a> OwnedKeyValueNodeIterator<'a> {
fn new(node: &'a OwnedKeyValueNode) -> Self {
OwnedKeyValueNodeIterator {
next_node: &node.parent,
iter: node.values.iter(),
}
}
}
impl<'a> Iterator for OwnedKeyValueNodeIterator<'a> {
type Item = &'a OwnedKeyValue;
fn next(&mut self) -> Option<Self::Item> {
loop {
match self.iter.next() {
Some(x) => return Some(&*x),
None => {
match self.next_node {
&Some(ref node) => {
self.iter = node.values.iter();
self.next_node = &node.parent;
}
&None => return None,
}
}
}
}
}
}
#[inline(always)]
#[doc(hidden)]
pub fn __slog_static_max_level() -> FilterLevel {
if !cfg!(debug_assertions) {
if cfg!(feature = "release_max_level_off") {
return FilterLevel::Off
} else if cfg!(feature = "release_max_level_error") {
return FilterLevel::Error
} else if cfg!(feature = "release_max_level_warn") {
return FilterLevel::Warning
} else if cfg!(feature = "release_max_level_info") {
return FilterLevel::Info
} else if cfg!(feature = "release_max_level_debug") {
return FilterLevel::Debug
} else if cfg!(feature = "release_max_level_trace") {
return FilterLevel::Trace
}
}
if cfg!(feature = "max_level_off") {
FilterLevel::Off
} else if cfg!(feature = "max_level_error") {
FilterLevel::Error
} else if cfg!(feature = "max_level_warn") {
FilterLevel::Warning
} else if cfg!(feature = "max_level_info") {
FilterLevel::Info
} else if cfg!(feature = "max_level_debug") {
FilterLevel::Debug
} else {
FilterLevel::Trace
}
}
#[cfg(test)]
mod tests;