Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 134 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,48 @@ impl Level {
pub fn iter() -> impl Iterator<Item = Self> {
(1..6).map(|i| Self::from_usize(i).unwrap())
}

/// Get the next-highest `Level` from this one.
///
/// If the current `Level` is at the highest level, the returned `Level` will be the same as the
/// current one.
///
/// # Examples
///
/// ```
/// use log::Level;
///
/// let level = Level::Info;
///
/// assert_eq!(Level::Debug, level.increment_severity());
/// assert_eq!(Level::Trace, level.increment_severity().increment_severity());
/// assert_eq!(Level::Trace, level.increment_severity().increment_severity().increment_severity()); // max level
/// ```
pub fn increment_severity(&self) -> Self {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@KodrAus love the suggestion!

let current = *self as usize;
Self::from_usize(current + 1).unwrap_or(*self)
}

/// Get the next-lowest `Level` from this one.
///
/// If the current `Level` is at the lowest level, the returned `Level` will be the same as the
/// current one.
///
/// # Examples
///
/// ```
/// use log::Level;
///
/// let level = Level::Info;
///
/// assert_eq!(Level::Warn, level.decrement_severity());
/// assert_eq!(Level::Error, level.decrement_severity().decrement_severity());
/// assert_eq!(Level::Error, level.decrement_severity().decrement_severity().decrement_severity()); // min level
/// ```
pub fn decrement_severity(&self) -> Self {
let current = *self as usize;
Self::from_usize(current.saturating_sub(1)).unwrap_or(*self)
}
}

/// An enum representing the available verbosity level filters of the logger.
Expand Down Expand Up @@ -685,6 +727,49 @@ impl LevelFilter {
pub fn iter() -> impl Iterator<Item = Self> {
(0..6).map(|i| Self::from_usize(i).unwrap())
}

/// Get the next-highest `LevelFilter` from this one.
///
/// If the current `LevelFilter` is at the highest level, the returned `LevelFilter` will be the
/// same as the current one.
///
/// # Examples
///
/// ```
/// use log::LevelFilter;
///
/// let level_filter = LevelFilter::Info;
///
/// assert_eq!(LevelFilter::Debug, level_filter.increment_severity());
/// assert_eq!(LevelFilter::Trace, level_filter.increment_severity().increment_severity());
/// assert_eq!(LevelFilter::Trace, level_filter.increment_severity().increment_severity().increment_severity()); // max level
/// ```
pub fn increment_severity(&self) -> Self {
let current = *self as usize;
Self::from_usize(current + 1).unwrap_or(*self)
}

/// Get the next-lowest `LevelFilter` from this one.
///
/// If the current `LevelFilter` is at the lowest level, the returned `LevelFilter` will be the
/// same as the current one.
///
/// # Examples
///
/// ```
/// use log::LevelFilter;
///
/// let level_filter = LevelFilter::Info;
///
/// assert_eq!(LevelFilter::Warn, level_filter.decrement_severity());
/// assert_eq!(LevelFilter::Error, level_filter.decrement_severity().decrement_severity());
/// assert_eq!(LevelFilter::Off, level_filter.decrement_severity().decrement_severity().decrement_severity());
/// assert_eq!(LevelFilter::Off, level_filter.decrement_severity().decrement_severity().decrement_severity().decrement_severity()); // min level
/// ```
pub fn decrement_severity(&self) -> Self {
let current = *self as usize;
Self::from_usize(current.saturating_sub(1)).unwrap_or(*self)
}
}

#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
Expand Down Expand Up @@ -1648,6 +1733,55 @@ mod tests {
}
}

#[test]
fn test_level_up() {
let info = Level::Info;
let up = info.increment_severity();
assert_eq!(up, Level::Debug);

let trace = Level::Trace;
let up = trace.increment_severity();
// trace is already highest level
assert_eq!(up, trace);
}

#[test]
fn test_level_filter_up() {
let info = LevelFilter::Info;
let up = info.increment_severity();
assert_eq!(up, LevelFilter::Debug);

let trace = LevelFilter::Trace;
let up = trace.increment_severity();
// trace is already highest level
assert_eq!(up, trace);
}

#[test]
fn test_level_down() {
let info = Level::Info;
let down = info.decrement_severity();
assert_eq!(down, Level::Warn);

let error = Level::Error;
let down = error.decrement_severity();
// error is already lowest level
assert_eq!(down, error);
}

#[test]
fn test_level_filter_down() {
let info = LevelFilter::Info;
let down = info.decrement_severity();
assert_eq!(down, LevelFilter::Warn);

let error = LevelFilter::Error;
let down = error.decrement_severity();
assert_eq!(down, LevelFilter::Off);
// Off is already the lowest
assert_eq!(down.decrement_severity(), down);
}

#[test]
#[cfg_attr(not(debug_assertions), ignore)]
fn test_static_max_level_debug() {
Expand Down
Loading