recursive_size.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. First field is size in bytes and second field
  11. /// is size in blocks
  12. Some(u64, u64),
  13. }
  14. impl RecursiveSize {
  15. /// Returns `true` if `None`
  16. ///
  17. /// # Examples
  18. ///
  19. /// ```
  20. /// use eza::fs::recursive_size::RecursiveSize;
  21. ///
  22. /// let x = RecursiveSize::None;
  23. /// assert_eq!(x.is_none(), true);
  24. ///
  25. /// let x = RecursiveSize::Unknown;
  26. /// assert_eq!(x.is_none(), false);
  27. ///
  28. /// let x = RecursiveSize::Some(0);
  29. /// assert_eq!(x.is_none(), false);
  30. #[inline]
  31. pub const fn is_none(&self) -> bool {
  32. matches!(*self, Self::None)
  33. }
  34. /// Returns the contained [`Some`] value or a provided default.
  35. ///
  36. /// # Examples
  37. ///
  38. /// ```
  39. /// use eza::fs::recursive_size::RecursiveSize;
  40. ///
  41. /// assert_eq!(RecursiveSize::None.unwrap_bytes_or(1), 1);
  42. /// assert_eq!(RecursiveSize::Unknown.unwrap_bytes_or(1), 1);
  43. /// assert_eq!(RecursiveSize::Some(2, 3).unwrap_bytes_or(1), 2);
  44. /// ```
  45. #[inline]
  46. pub const fn unwrap_bytes_or(self, default: u64) -> u64 {
  47. match self {
  48. Self::Some(bytes, _blocks) => bytes,
  49. _ => default,
  50. }
  51. }
  52. /// Returns the provided default result (if None or Unknown),
  53. /// or applies a function to the contained value (if Some).
  54. ///
  55. /// # Examples
  56. ///
  57. /// ```
  58. /// use eza::fs::recursive_size::RecursiveSize;
  59. ///
  60. /// assert_eq!(RecursiveSize::None.map_or(None, |s, _| Some(s * 2)), None);
  61. /// assert_eq!(RecursiveSize::Unknown.map_or(None, |s, _| Some(s * 2)), None);
  62. /// assert_eq!(RecursiveSize::Some(2, 3).map_or(None, |s, _| Some(s * 2)), Some(4));
  63. #[inline]
  64. pub fn map_or<U, F>(self, default: U, f: F) -> U
  65. where
  66. F: FnOnce(u64, u64) -> U,
  67. {
  68. match self {
  69. RecursiveSize::Some(bytes, blocks) => f(bytes, blocks),
  70. _ => default,
  71. }
  72. }
  73. }