recursive_size.rs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /// Used to represent a the size of a recursive directory traversal. `None`
  2. /// should be used when the file does not represent a directory or the recursive
  3. /// size should not be calculated.
  4. #[derive(Copy, Clone, Debug)]
  5. pub enum RecursiveSize {
  6. /// Size should not be computed
  7. None,
  8. /// Size should be computed but has not been computed yet
  9. Unknown,
  10. /// Size has been computed
  11. Some(u64),
  12. }
  13. impl RecursiveSize {
  14. /// Returns `true` if `None`
  15. ///
  16. /// # Examples
  17. ///
  18. /// ```
  19. /// use eza::fs::recursive_size::RecursiveSize;
  20. ///
  21. /// let x = RecursiveSize::None;
  22. /// assert_eq!(x.is_none(), true);
  23. ///
  24. /// let x = RecursiveSize::Unknown;
  25. /// assert_eq!(x.is_none(), false);
  26. ///
  27. /// let x = RecursiveSize::Some(0);
  28. /// assert_eq!(x.is_none(), false);
  29. #[inline]
  30. pub const fn is_none(&self) -> bool {
  31. matches!(*self, Self::None)
  32. }
  33. /// Returns the contained [`Some`] value or a provided default.
  34. ///
  35. /// # Examples
  36. ///
  37. /// ```
  38. /// use eza::fs::recursive_size::RecursiveSize;
  39. ///
  40. /// assert_eq!(RecursiveSize::None.unwrap_or(1), 1);
  41. /// assert_eq!(RecursiveSize::Unknown.unwrap_or(1), 1);
  42. /// assert_eq!(RecursiveSize::Some(2).unwrap_or(1), 2);
  43. /// ```
  44. #[inline]
  45. pub const fn unwrap_or(self, default: u64) -> u64 {
  46. match self {
  47. Self::Some(x) => x,
  48. _ => default,
  49. }
  50. }
  51. /// Returns the provided default result (if None or Unknown),
  52. /// or applies a function to the contained value (if Some).
  53. ///
  54. /// # Examples
  55. ///
  56. /// ```
  57. /// use eza::fs::recursive_size::RecursiveSize;
  58. ///
  59. /// assert_eq!(RecursiveSize::None.map_or(None, |s| Some(s * 2)), None);
  60. /// assert_eq!(RecursiveSize::Unknown.map_or(None, |s| Some(s * 2)), None);
  61. /// assert_eq!(RecursiveSize::Some(2).map_or(None, |s| Some(s * 2)), Some(4));
  62. #[inline]
  63. pub fn map_or<U, F>(self, default: U, f: F) -> U
  64. where
  65. F: FnOnce(u64) -> U,
  66. {
  67. match self {
  68. RecursiveSize::Some(x) => f(x),
  69. _ => default,
  70. }
  71. }
  72. }