use std::fmt;
#[derive(Clone)]
pub struct Metadata(libc::statx);
impl Metadata {
#[allow(clippy::len_without_is_empty)]
pub fn len(&self) -> u64 {
self.0.stx_size
}
pub fn is_dir(&self) -> bool {
self.is_type(libc::S_IFDIR)
}
pub fn is_file(&self) -> bool {
self.is_type(libc::S_IFREG)
}
pub fn is_symlink(&self) -> bool {
self.is_type(libc::S_IFLNK)
}
}
impl Metadata {
fn is_type(&self, ty: libc::mode_t) -> bool {
(self.0.stx_mode as u32 & libc::S_IFMT) == ty
}
}
#[doc(hidden)]
impl From<libc::statx> for Metadata {
fn from(stat: libc::statx) -> Self {
Self(stat)
}
}
impl fmt::Debug for Metadata {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Metadata")
.field("len", &self.len())
.field("is_dir", &self.is_dir())
.field("is_file", &self.is_file())
.field("is_symlink", &self.is_symlink())
.finish()
}
}
impl std::os::unix::fs::MetadataExt for Metadata {
fn dev(&self) -> u64 {
libc::makedev(self.0.stx_dev_major, self.0.stx_dev_minor)
}
fn ino(&self) -> u64 {
self.0.stx_ino
}
fn mode(&self) -> u32 {
self.0.stx_mode.into()
}
fn nlink(&self) -> u64 {
self.0.stx_nlink.into()
}
fn uid(&self) -> u32 {
self.0.stx_uid
}
fn gid(&self) -> u32 {
self.0.stx_gid
}
fn rdev(&self) -> u64 {
libc::makedev(self.0.stx_rdev_major, self.0.stx_rdev_minor)
}
fn size(&self) -> u64 {
self.0.stx_size
}
fn atime(&self) -> i64 {
self.0.stx_atime.tv_sec
}
fn atime_nsec(&self) -> i64 {
self.0.stx_atime.tv_nsec.into()
}
fn mtime(&self) -> i64 {
self.0.stx_mtime.tv_sec
}
fn mtime_nsec(&self) -> i64 {
self.0.stx_mtime.tv_nsec.into()
}
fn ctime(&self) -> i64 {
self.0.stx_ctime.tv_sec
}
fn ctime_nsec(&self) -> i64 {
self.0.stx_ctime.tv_nsec.into()
}
fn blksize(&self) -> u64 {
self.0.stx_blksize.into()
}
fn blocks(&self) -> u64 {
self.0.stx_blocks
}
}