@@ -576,6 +576,48 @@ impl Level {
576576 pub fn iter ( ) -> impl Iterator < Item = Self > {
577577 ( 1 ..6 ) . map ( |i| Self :: from_usize ( i) . unwrap ( ) )
578578 }
579+
580+ /// Get the next-highest `Level` from this one.
581+ ///
582+ /// If the current `Level` is at the highest level, the returned `Level` will be the same as the
583+ /// current one.
584+ ///
585+ /// # Examples
586+ ///
587+ /// ```
588+ /// use log::Level;
589+ ///
590+ /// let level = Level::Info;
591+ ///
592+ /// assert_eq!(Level::Debug, level.up());
593+ /// assert_eq!(Level::Trace, level.up().up());
594+ /// assert_eq!(Level::Trace, level.up().up().up()); // max level
595+ /// ```
596+ pub fn up ( & self ) -> Self {
597+ let current = * self as usize ;
598+ Self :: from_usize ( current + 1 ) . unwrap_or ( * self )
599+ }
600+
601+ /// Get the next-lowest `Level` from this one.
602+ ///
603+ /// If the current `Level` is at the lowest level, the returned `Level` will be the same as the
604+ /// current one.
605+ ///
606+ /// # Examples
607+ ///
608+ /// ```
609+ /// use log::Level;
610+ ///
611+ /// let level = Level::Info;
612+ ///
613+ /// assert_eq!(Level::Warn, level.down());
614+ /// assert_eq!(Level::Error, level.down().down());
615+ /// assert_eq!(Level::Error, level.down().down().down()); // min level
616+ /// ```
617+ pub fn down ( & self ) -> Self {
618+ let current = * self as usize ;
619+ Self :: from_usize ( current. saturating_sub ( 1 ) ) . unwrap_or ( * self )
620+ }
579621}
580622
581623/// An enum representing the available verbosity level filters of the logger.
@@ -685,6 +727,49 @@ impl LevelFilter {
685727 pub fn iter ( ) -> impl Iterator < Item = Self > {
686728 ( 0 ..6 ) . map ( |i| Self :: from_usize ( i) . unwrap ( ) )
687729 }
730+
731+ /// Get the next-highest `LevelFilter` from this one.
732+ ///
733+ /// If the current `LevelFilter` is at the highest level, the returned `LevelFilter` will be the
734+ /// same as the current one.
735+ ///
736+ /// # Examples
737+ ///
738+ /// ```
739+ /// use log::LevelFilter;
740+ ///
741+ /// let level_filter = LevelFilter::Info;
742+ ///
743+ /// assert_eq!(LevelFilter::Debug, level_filter.up());
744+ /// assert_eq!(LevelFilter::Trace, level_filter.up().up());
745+ /// assert_eq!(LevelFilter::Trace, level_filter.up().up().up()); // max level
746+ /// ```
747+ pub fn up ( & self ) -> Self {
748+ let current = * self as usize ;
749+ Self :: from_usize ( current + 1 ) . unwrap_or ( * self )
750+ }
751+
752+ /// Get the next-lowest `LevelFilter` from this one.
753+ ///
754+ /// If the current `LevelFilter` is at the lowest level, the returned `LevelFilter` will be the
755+ /// same as the current one.
756+ ///
757+ /// # Examples
758+ ///
759+ /// ```
760+ /// use log::LevelFilter;
761+ ///
762+ /// let level_filter = LevelFilter::Info;
763+ ///
764+ /// assert_eq!(LevelFilter::Warn, level_filter.down());
765+ /// assert_eq!(LevelFilter::Error, level_filter.down().down());
766+ /// assert_eq!(LevelFilter::Off, level_filter.down().down().down());
767+ /// assert_eq!(LevelFilter::Off, level_filter.down().down().down().down()); // min level
768+ /// ```
769+ pub fn down ( & self ) -> Self {
770+ let current = * self as usize ;
771+ Self :: from_usize ( current. saturating_sub ( 1 ) ) . unwrap_or ( * self )
772+ }
688773}
689774
690775#[ derive( Copy , Clone , Eq , PartialEq , Ord , PartialOrd , Hash , Debug ) ]
@@ -1648,6 +1733,55 @@ mod tests {
16481733 }
16491734 }
16501735
1736+ #[ test]
1737+ fn test_level_up ( ) {
1738+ let info = Level :: Info ;
1739+ let up = info. up ( ) ;
1740+ assert_eq ! ( up, Level :: Debug ) ;
1741+
1742+ let trace = Level :: Trace ;
1743+ let up = trace. up ( ) ;
1744+ // trace is already highest level
1745+ assert_eq ! ( up, trace) ;
1746+ }
1747+
1748+ #[ test]
1749+ fn test_level_filter_up ( ) {
1750+ let info = LevelFilter :: Info ;
1751+ let up = info. up ( ) ;
1752+ assert_eq ! ( up, LevelFilter :: Debug ) ;
1753+
1754+ let trace = LevelFilter :: Trace ;
1755+ let up = trace. up ( ) ;
1756+ // trace is already highest level
1757+ assert_eq ! ( up, trace) ;
1758+ }
1759+
1760+ #[ test]
1761+ fn test_level_down ( ) {
1762+ let info = Level :: Info ;
1763+ let down = info. down ( ) ;
1764+ assert_eq ! ( down, Level :: Warn ) ;
1765+
1766+ let error = Level :: Error ;
1767+ let down = error. down ( ) ;
1768+ // error is already lowest level
1769+ assert_eq ! ( down, error) ;
1770+ }
1771+
1772+ #[ test]
1773+ fn test_level_filter_down ( ) {
1774+ let info = LevelFilter :: Info ;
1775+ let down = info. down ( ) ;
1776+ assert_eq ! ( down, LevelFilter :: Warn ) ;
1777+
1778+ let error = LevelFilter :: Error ;
1779+ let down = error. down ( ) ;
1780+ assert_eq ! ( down, LevelFilter :: Off ) ;
1781+ // Off is already the lowest
1782+ assert_eq ! ( down. down( ) , down) ;
1783+ }
1784+
16511785 #[ test]
16521786 #[ cfg_attr( not( debug_assertions) , ignore) ]
16531787 fn test_static_max_level_debug ( ) {
0 commit comments