log4rs 0.6.0

A highly configurable multi-output logging implementation for the `log` facade
Documentation
use log::LogLevelFilter;
use serde::de::{self, Deserialize};
use std::fmt;

pub fn de_filter<D>(d: D) -> Result<LogLevelFilter, D::Error>
    where D: de::Deserializer
{
    struct S(LogLevelFilter);

    impl de::Deserialize for S {
        fn deserialize<D>(d: D) -> Result<S, D::Error>
            where D: de::Deserializer
        {
            struct V;

            impl de::Visitor for V {
                type Value = S;

                fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
                    fmt.write_str("a log level")
                }

                fn visit_str<E>(self, v: &str) -> Result<S, E>
                    where E: de::Error
                {
                    v.parse().map(S).map_err(|_| E::custom(v))
                }
            }

            d.deserialize_str(V)
        }
    }

    S::deserialize(d).map(|s| s.0)
}