use std::path::Path;
use nix::sys;
use crate::{Bytes, Percent, Result};
#[derive(Clone, Debug, Default)]
pub struct DiskUsage {
pub(crate) total: Bytes,
pub(crate) used: Bytes,
pub(crate) free: Bytes,
pub(crate) percent: Percent,
}
impl DiskUsage {
pub fn total(&self) -> Bytes {
self.total
}
pub fn used(&self) -> Bytes {
self.used
}
pub fn free(&self) -> Bytes {
self.free
}
pub fn percent(&self) -> Percent {
self.percent
}
}
#[allow(clippy::unnecessary_cast)]
pub fn disk_usage<P>(path: P) -> Result<DiskUsage>
where
P: AsRef<Path>,
{
let statvfs = sys::statvfs::statvfs(path.as_ref())?;
let total = statvfs.blocks() as u64 * statvfs.fragment_size() as u64;
let avail_to_root = statvfs.blocks_free() as u64 * statvfs.fragment_size() as u64;
let used = total - avail_to_root;
let free = statvfs.blocks_available() as u64 * statvfs.fragment_size() as u64;
let total_user = used + free;
let percent = ((used as f64 / total_user as f64) * 100.0) as f32;
Ok(DiskUsage {
total,
used,
free,
percent,
})
}