clap_verbosity_flag/
tracing.rs

1// These re-exports of the tracing crate types it easy to use this crate without having to depend on
2// the tracing crate directly. See <https://github.com/clap-rs/clap-verbosity-flag/issues/54> for
3// more information.
4pub use tracing_core::{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.tracing_level_filter()
63    }
64}
65
66impl<L: LogLevel> From<Verbosity<L>> for Option<Level> {
67    fn from(v: Verbosity<L>) -> Self {
68        v.tracing_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 tracing_level() {
79        let v = Verbosity::<OffLevel>::default();
80        assert_eq!(v.tracing_level(), None);
81        assert_eq!(v.tracing_level_filter(), LevelFilter::OFF);
82
83        let v = Verbosity::<ErrorLevel>::default();
84        assert_eq!(v.tracing_level(), Some(Level::ERROR));
85        assert_eq!(v.tracing_level_filter(), LevelFilter::ERROR);
86
87        let v = Verbosity::<WarnLevel>::default();
88        assert_eq!(v.tracing_level(), Some(Level::WARN));
89        assert_eq!(v.tracing_level_filter(), LevelFilter::WARN);
90
91        let v = Verbosity::<InfoLevel>::default();
92        assert_eq!(v.tracing_level(), Some(Level::INFO));
93        assert_eq!(v.tracing_level_filter(), LevelFilter::INFO);
94
95        let v = Verbosity::<DebugLevel>::default();
96        assert_eq!(v.tracing_level(), Some(Level::DEBUG));
97        assert_eq!(v.tracing_level_filter(), LevelFilter::DEBUG);
98
99        let v = Verbosity::<TraceLevel>::default();
100        assert_eq!(v.tracing_level(), Some(Level::TRACE));
101        assert_eq!(v.tracing_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}