use crate::error::MyResult;
use crate::fs::entry::Entry;
use crate::fs::file::Signature;
use crate::fs::flags::FileFlags;
use std::ffi::OsStr;
use std::path::{Path, PathBuf};
use std::rc::Rc;
use std::time::SystemTime;
#[cfg(unix)]
use uzers::{gid_t, uid_t};
pub struct CloneEntry {
file_depth: usize,
inner_depth: Option<usize>,
file_flags: FileFlags,
file_mode: u32,
#[cfg(unix)]
owner_uid: uid_t,
#[cfg(unix)]
owner_gid: gid_t,
file_size: u64,
file_time: SystemTime,
}
impl CloneEntry {
#[cfg(unix)]
pub fn from_entry(entry: &dyn Entry) -> Rc<Box<dyn Entry>> {
let file_depth = entry.file_depth();
let inner_depth = entry.inner_depth();
let file_flags = entry.file_flags();
let file_mode = entry.file_mode();
let owner_uid = entry.owner_uid();
let owner_gid = entry.owner_gid();
let file_size = entry.file_size();
let file_time = entry.file_time();
let entry = Self {
file_depth,
inner_depth,
file_flags,
file_mode,
owner_uid,
owner_gid,
file_size,
file_time,
};
Rc::new(Box::new(entry))
}
#[cfg(not(unix))]
pub fn from_entry(entry: &dyn Entry) -> Rc<Box<dyn Entry>> {
let file_depth = entry.file_depth();
let inner_depth = entry.inner_depth();
let file_flags = entry.file_flags();
let file_mode = entry.file_mode();
let file_size = entry.file_size();
let file_time = entry.file_time();
let entry = Self {
file_depth,
inner_depth,
file_flags,
file_mode,
file_size,
file_time,
};
Rc::new(Box::new(entry))
}
}
impl Entry for CloneEntry {
fn file_path(&self) -> &Path {
static PATH: once_cell::sync::OnceCell<PathBuf> = once_cell::sync::OnceCell::new();
PATH.get_or_init(|| PathBuf::new()).as_path()
}
fn file_name(&self) -> &OsStr {
self.file_path().file_name().unwrap_or_default()
}
fn file_depth(&self) -> usize {
self.file_depth
}
fn inner_path(&self) -> Option<&Path> {
None
}
fn inner_depth(&self) -> Option<usize> {
self.inner_depth
}
fn file_flags(&self) -> FileFlags {
self.file_flags
}
fn read_sig(&self) -> Option<Signature> {
None
}
#[cfg(windows)]
fn read_version(&self) -> Option<String> {
None
}
fn read_link(&self) -> MyResult<Option<PathBuf>> {
Ok(None)
}
fn copy_metadata(&self, _other: &dyn Entry) {
}
fn reset_metadata(&self) {
}
fn file_mode(&self) -> u32 {
self.file_mode
}
#[cfg(unix)]
fn owner_uid(&self) -> uid_t {
self.owner_uid
}
#[cfg(unix)]
fn owner_gid(&self) -> gid_t {
self.owner_gid
}
fn file_size(&self) -> u64 {
self.file_size
}
fn file_time(&self) -> SystemTime {
self.file_time
}
}