Skip to content

Commit f735876

Browse files
committed
feat: Add conversion methods between Verbosity and VerbosityFilter
This will simplify the implementation of Serialization.
1 parent e6f4e62 commit f735876

File tree

1 file changed

+50
-9
lines changed

1 file changed

+50
-9
lines changed

src/lib.rs

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,21 @@ impl<L: LogLevel> fmt::Display for Verbosity<L> {
200200
}
201201
}
202202

203+
impl<L: LogLevel> From<Verbosity<L>> for VerbosityFilter {
204+
fn from(verbosity: Verbosity<L>) -> Self {
205+
verbosity.filter()
206+
}
207+
}
208+
209+
impl<L: LogLevel> From<VerbosityFilter> for Verbosity<L> {
210+
fn from(filter: VerbosityFilter) -> Self {
211+
let default = L::default_filter();
212+
let verbose = filter.value().saturating_sub(default.value());
213+
let quiet = default.value().saturating_sub(filter.value());
214+
Verbosity::new(verbose, quiet)
215+
}
216+
}
217+
203218
/// Customize the default log-level and associated help
204219
pub trait LogLevel {
205220
/// Baseline level before applying `--verbose` and `--quiet`
@@ -244,15 +259,7 @@ impl VerbosityFilter {
244259
///
245260
/// Negative values will decrease the verbosity, while positive values will increase it.
246261
fn with_offset(&self, offset: i16) -> VerbosityFilter {
247-
let value = match self {
248-
Self::Off => 0_i16,
249-
Self::Error => 1,
250-
Self::Warn => 2,
251-
Self::Info => 3,
252-
Self::Debug => 4,
253-
Self::Trace => 5,
254-
};
255-
match value.saturating_add(offset) {
262+
match i16::from(self.value()).saturating_add(offset) {
256263
i16::MIN..=0 => Self::Off,
257264
1 => Self::Error,
258265
2 => Self::Warn,
@@ -261,6 +268,20 @@ impl VerbosityFilter {
261268
5..=i16::MAX => Self::Trace,
262269
}
263270
}
271+
272+
/// Get the numeric value of the filter.
273+
///
274+
/// This is an internal representation of the filter level used only for conversion / offset.
275+
fn value(&self) -> u8 {
276+
match self {
277+
Self::Off => 0,
278+
Self::Error => 1,
279+
Self::Warn => 2,
280+
Self::Info => 3,
281+
Self::Debug => 4,
282+
Self::Trace => 5,
283+
}
284+
}
264285
}
265286

266287
impl fmt::Display for VerbosityFilter {
@@ -491,4 +512,24 @@ mod test {
491512
assert_filter::<TraceLevel>(verbose, quiet, expected_filter);
492513
}
493514
}
515+
516+
#[test]
517+
fn from_verbosity_filter() {
518+
for &filter in &[
519+
VerbosityFilter::Off,
520+
VerbosityFilter::Error,
521+
VerbosityFilter::Warn,
522+
VerbosityFilter::Info,
523+
VerbosityFilter::Debug,
524+
VerbosityFilter::Trace,
525+
] {
526+
assert_eq!(Verbosity::<OffLevel>::from(filter).filter(), filter);
527+
assert_eq!(Verbosity::<ErrorLevel>::from(filter).filter(), filter);
528+
assert_eq!(Verbosity::<WarnLevel>::from(filter).filter(), filter);
529+
assert_eq!(Verbosity::<InfoLevel>::from(filter).filter(), filter);
530+
assert_eq!(Verbosity::<DebugLevel>::from(filter).filter(), filter);
531+
assert_eq!(Verbosity::<TraceLevel>::from(filter).filter(), filter);
532+
}
533+
}
534+
}
494535
}

0 commit comments

Comments
 (0)