#[cfg(unix)]
#[path = "unix.rs"]
mod sys;
#[cfg(windows)]
#[path = "windows.rs"]
mod sys;
#[cfg(windows)]
use std::os::windows::fs::{FileTypeExt, MetadataExt};
use std::{io, path::Path, time::SystemTime};
pub async fn metadata(path: impl AsRef<Path>) -> io::Result<Metadata> {
sys::metadata(path).await.map(Metadata)
}
pub async fn symlink_metadata(path: impl AsRef<Path>) -> io::Result<Metadata> {
sys::symlink_metadata(path).await.map(Metadata)
}
pub async fn set_permissions(path: impl AsRef<Path>, perm: Permissions) -> io::Result<()> {
sys::set_permissions(path, perm.0).await
}
#[derive(Clone)]
pub struct Metadata(sys::Metadata);
impl Metadata {
pub fn file_type(&self) -> FileType {
FileType(self.0.file_type())
}
pub fn is_dir(&self) -> bool {
self.0.is_dir()
}
pub fn is_file(&self) -> bool {
self.0.is_file()
}
pub fn is_symlink(&self) -> bool {
self.0.is_symlink()
}
#[allow(clippy::len_without_is_empty)]
pub fn len(&self) -> u64 {
self.0.len()
}
pub fn permissions(&self) -> Permissions {
Permissions(self.0.permissions())
}
pub fn modified(&self) -> io::Result<SystemTime> {
self.0.modified()
}
pub fn accessed(&self) -> io::Result<SystemTime> {
self.0.accessed()
}
pub fn created(&self) -> io::Result<SystemTime> {
self.0.created()
}
}
#[cfg(windows)]
impl Metadata {
pub fn from_std(m: std::fs::Metadata) -> Self {
Self(m)
}
pub fn file_attributes(&self) -> u32 {
self.0.file_attributes()
}
pub fn creation_time(&self) -> u64 {
self.0.creation_time()
}
pub fn last_access_time(&self) -> u64 {
self.0.last_access_time()
}
pub fn last_write_time(&self) -> u64 {
self.0.last_write_time()
}
}
#[cfg(all(windows, feature = "windows_by_handle"))]
impl Metadata {
pub fn volume_serial_number(&self) -> Option<u32> {
self.0.volume_serial_number()
}
pub fn number_of_links(&self) -> Option<u32> {
self.0.number_of_links()
}
pub fn file_index(&self) -> Option<u64> {
self.0.file_index()
}
}
#[cfg(unix)]
impl Metadata {
pub fn from_stat(stat: libc::stat) -> Self {
Self(sys::Metadata::from_stat(stat))
}
}
#[cfg(unix)]
impl std::os::unix::prelude::MetadataExt for Metadata {
fn dev(&self) -> u64 {
self.0.dev()
}
fn ino(&self) -> u64 {
self.0.ino()
}
fn mode(&self) -> u32 {
self.0.mode()
}
fn nlink(&self) -> u64 {
self.0.nlink()
}
fn uid(&self) -> u32 {
self.0.uid()
}
fn gid(&self) -> u32 {
self.0.gid()
}
fn rdev(&self) -> u64 {
self.0.rdev()
}
fn size(&self) -> u64 {
self.0.size()
}
fn atime(&self) -> i64 {
self.0.atime()
}
fn atime_nsec(&self) -> i64 {
self.0.atime_nsec()
}
fn mtime(&self) -> i64 {
self.0.mtime()
}
fn mtime_nsec(&self) -> i64 {
self.0.mtime_nsec()
}
fn ctime(&self) -> i64 {
self.0.ctime()
}
fn ctime_nsec(&self) -> i64 {
self.0.ctime_nsec()
}
fn blksize(&self) -> u64 {
self.0.blksize()
}
fn blocks(&self) -> u64 {
self.0.blocks()
}
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
pub struct FileType(sys::FileType);
impl FileType {
pub fn is_dir(&self) -> bool {
self.0.is_dir()
}
pub fn is_file(&self) -> bool {
self.0.is_file()
}
pub fn is_symlink(&self) -> bool {
self.0.is_symlink()
}
}
#[cfg(windows)]
impl FileType {
pub fn is_symlink_dir(&self) -> bool {
self.0.is_symlink_dir()
}
pub fn is_symlink_file(&self) -> bool {
self.0.is_symlink_file()
}
}
#[cfg(unix)]
impl std::os::unix::prelude::FileTypeExt for FileType {
fn is_block_device(&self) -> bool {
self.0.is_block_device()
}
fn is_char_device(&self) -> bool {
self.0.is_char_device()
}
fn is_fifo(&self) -> bool {
self.0.is_fifo()
}
fn is_socket(&self) -> bool {
self.0.is_socket()
}
}
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Permissions(pub(crate) sys::Permissions);
impl Permissions {
pub fn readonly(&self) -> bool {
self.0.readonly()
}
pub fn set_readonly(&mut self, readonly: bool) {
self.0.set_readonly(readonly)
}
}
#[cfg(unix)]
impl std::os::unix::prelude::PermissionsExt for Permissions {
fn mode(&self) -> u32 {
self.0.mode()
}
fn set_mode(&mut self, mode: u32) {
self.0.set_mode(mode)
}
fn from_mode(mode: u32) -> Self {
Self(sys::Permissions::from_mode(mode))
}
}