compare-dir 0.9.0

A high-performance directory comparison tool and library
Documentation
use simple_path::SimplePath;
use std::fmt::Display;
use std::fs;
use std::path::{Path, PathBuf};
use std::time::SystemTime;

#[derive(Clone, Debug)]
pub struct FileItem {
    path: PathBuf,
    size: u64,
    modified: SystemTime,
}

impl TryFrom<&walkdir::DirEntry> for FileItem {
    type Error = anyhow::Error;

    fn try_from(entry: &walkdir::DirEntry) -> Result<Self, Self::Error> {
        let metadata = entry.metadata()?;
        Ok(Self {
            path: entry.path().to_path_buf(),
            size: metadata.len(),
            modified: metadata.modified()?,
        })
    }
}

impl TryFrom<&Path> for FileItem {
    type Error = anyhow::Error;

    fn try_from(path: &Path) -> Result<Self, Self::Error> {
        let metadata = fs::metadata(path)?;
        Ok(Self {
            path: path.to_path_buf(),
            size: metadata.len(),
            modified: metadata.modified()?,
        })
    }
}

impl Display for FileItem {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_fmt(format_args!("{}", self.path.display()))
    }
}

impl FileItem {
    pub fn path(&self) -> &Path {
        &self.path
    }

    pub fn into_path_buf(self) -> PathBuf {
        self.path
    }

    pub fn relative_path(&self, base: &Path) -> &Path {
        SimplePath::strip_prefix(&self.path, base).unwrap()
    }

    pub fn size(&self) -> u64 {
        self.size
    }

    pub fn modified(&self) -> SystemTime {
        self.modified
    }
}