clap_verbosity_flag/
log.rs

1// These re-exports of the log crate make it easy to use this crate without having to depend on the
2// log crate directly. See <https://github.com/clap-rs/clap-verbosity-flag/issues/54> for more
3// information.
4pub use log::{Level, LevelFilter};
5
6use crate::{LogLevel, Verbosity, VerbosityFilter};
7
8impl From<VerbosityFilter> for LevelFilter {
9    fn from(filter: VerbosityFilter) -> Self {
10        match filter {
11            VerbosityFilter::Off => LevelFilter::Off,
12            VerbosityFilter::Error => LevelFilter::Error,
13            VerbosityFilter::Warn => LevelFilter::Warn,
14            VerbosityFilter::Info => LevelFilter::Info,
15            VerbosityFilter::Debug => LevelFilter::Debug,
16            VerbosityFilter::Trace => LevelFilter::Trace,
17        }
18    }
19}
20
21impl From<LevelFilter> for VerbosityFilter {
22    fn from(level: LevelFilter) -> Self {
23        match level {
24            LevelFilter::Off => Self::Off,
25            LevelFilter::Error => Self::Error,
26            LevelFilter::Warn => Self::Warn,
27            LevelFilter::Info => Self::Info,
28            LevelFilter::Debug => Self::Debug,
29            LevelFilter::Trace => Self::Trace,
30        }
31    }
32}
33
34impl From<VerbosityFilter> for Option<Level> {
35    fn from(filter: VerbosityFilter) -> Self {
36        match filter {
37            VerbosityFilter::Off => None,
38            VerbosityFilter::Error => Some(Level::Error),
39            VerbosityFilter::Warn => Some(Level::Warn),
40            VerbosityFilter::Info => Some(Level::Info),
41            VerbosityFilter::Debug => Some(Level::Debug),
42            VerbosityFilter::Trace => Some(Level::Trace),
43        }
44    }
45}
46
47impl From<Option<Level>> for VerbosityFilter {
48    fn from(level: Option<Level>) -> Self {
49        match level {
50            None => Self::Off,
51            Some(Level::Error) => Self::Error,
52            Some(Level::Warn) => Self::Warn,
53            Some(Level::Info) => Self::Info,
54            Some(Level::Debug) => Self::Debug,
55            Some(Level::Trace) => Self::Trace,
56        }
57    }
58}
59
60impl<L: LogLevel> From<Verbosity<L>> for LevelFilter {
61    fn from(v: Verbosity<L>) -> Self {
62        v.log_level_filter()
63    }
64}
65
66impl<L: LogLevel> From<Verbosity<L>> for Option<Level> {
67    fn from(v: Verbosity<L>) -> Self {
68        v.log_level()
69    }
70}
71
72#[cfg(test)]
73mod tests {
74    use super::*;
75    use crate::{DebugLevel, ErrorLevel, InfoLevel, OffLevel, TraceLevel, Verbosity, WarnLevel};
76
77    #[test]
78    fn log_level() {
79        let v = Verbosity::<OffLevel>::default();
80        assert_eq!(v.log_level(), None);
81        assert_eq!(v.log_level_filter(), LevelFilter::Off);
82
83        let v = Verbosity::<ErrorLevel>::default();
84        assert_eq!(v.log_level(), Some(Level::Error));
85        assert_eq!(v.log_level_filter(), LevelFilter::Error);
86
87        let v = Verbosity::<WarnLevel>::default();
88        assert_eq!(v.log_level(), Some(Level::Warn));
89        assert_eq!(v.log_level_filter(), LevelFilter::Warn);
90
91        let v = Verbosity::<InfoLevel>::default();
92        assert_eq!(v.log_level(), Some(Level::Info));
93        assert_eq!(v.log_level_filter(), LevelFilter::Info);
94
95        let v = Verbosity::<DebugLevel>::default();
96        assert_eq!(v.log_level(), Some(Level::Debug));
97        assert_eq!(v.log_level_filter(), LevelFilter::Debug);
98
99        let v = Verbosity::<TraceLevel>::default();
100        assert_eq!(v.log_level(), Some(Level::Trace));
101        assert_eq!(v.log_level_filter(), LevelFilter::Trace);
102    }
103
104    #[test]
105    fn into_opt_level() {
106        let v = Verbosity::<OffLevel>::default();
107        assert_eq!(Option::<Level>::from(v), None);
108
109        let v = Verbosity::<ErrorLevel>::default();
110        assert_eq!(Option::<Level>::from(v), Some(Level::Error));
111
112        let v = Verbosity::<WarnLevel>::default();
113        assert_eq!(Option::<Level>::from(v), Some(Level::Warn));
114
115        let v = Verbosity::<InfoLevel>::default();
116        assert_eq!(Option::<Level>::from(v), Some(Level::Info));
117
118        let v = Verbosity::<DebugLevel>::default();
119        assert_eq!(Option::<Level>::from(v), Some(Level::Debug));
120
121        let v = Verbosity::<TraceLevel>::default();
122        assert_eq!(Option::<Level>::from(v), Some(Level::Trace));
123    }
124
125    #[test]
126    fn into_level_filter() {
127        let v = Verbosity::<OffLevel>::default();
128        assert_eq!(LevelFilter::from(v), LevelFilter::Off);
129
130        let v = Verbosity::<ErrorLevel>::default();
131        assert_eq!(LevelFilter::from(v), LevelFilter::Error);
132
133        let v = Verbosity::<WarnLevel>::default();
134        assert_eq!(LevelFilter::from(v), LevelFilter::Warn);
135
136        let v = Verbosity::<InfoLevel>::default();
137        assert_eq!(LevelFilter::from(v), LevelFilter::Info);
138
139        let v = Verbosity::<DebugLevel>::default();
140        assert_eq!(LevelFilter::from(v), LevelFilter::Debug);
141
142        let v = Verbosity::<TraceLevel>::default();
143        assert_eq!(LevelFilter::from(v), LevelFilter::Trace);
144    }
145}