ex-cli 1.20.1

Command line tool to find, filter, sort and list files.
Documentation
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
    }
}