use std::path::Path;
#[derive(Debug, Clone, Copy)]
pub struct DiskSpace {
pub total: u64,
pub avail: u64,
}
pub fn read_disk_space(path: &Path) -> anyhow::Result<DiskSpace> {
let total = fs4::total_space(path)
.map_err(|e| anyhow::anyhow!("disk total_space({}) failed: {e}", path.display()))?;
let avail = fs4::available_space(path)
.map_err(|e| anyhow::anyhow!("disk available_space({}) failed: {e}", path.display()))?;
Ok(DiskSpace { total, avail })
}
pub fn statvfs_target(path: &Path) -> anyhow::Result<DiskSpace> {
let mut cur = path;
loop {
if cur.exists() {
return read_disk_space(cur);
}
match cur.parent() {
Some(p) => cur = p,
None => return read_disk_space(path), }
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)] mod tests;