rusync 0.7.2

Minimalist rsync clone in Rust
Documentation
use std::fs;
use std::option::Option;
use std::path::Path;
use std::path::PathBuf;

#[derive(Debug, Clone)]
pub struct Entry {
    description: String,
    path: PathBuf,
    metadata: Option<fs::Metadata>,
    exists: bool,
    is_link: Option<bool>,
}

impl Entry {
    pub fn new(description: &str, entry_path: &Path) -> Entry {
        let mut metadata = fs::metadata(&entry_path).ok();
        let is_link;
        let symlink_metadata = fs::symlink_metadata(&entry_path);
        if let Ok(data) = symlink_metadata {
            is_link = Some(data.file_type().is_symlink());
            metadata = Some(data);
        } else {
            is_link = None;
        }

        Entry {
            description: String::from(description),
            metadata,
            path: entry_path.to_path_buf(),
            exists: entry_path.exists(),
            is_link,
        }
    }

    pub fn description(&self) -> &String {
        &self.description
    }

    pub fn path(&self) -> &PathBuf {
        &self.path
    }
    pub fn metadata(&self) -> Option<&fs::Metadata> {
        self.metadata.as_ref()
    }
    pub fn exists(&self) -> bool {
        self.exists
    }

    pub fn is_link(&self) -> Option<bool> {
        self.is_link
    }
}

#[cfg(test)]
mod tests {

    use super::Entry;
    use super::Path;

    #[test]
    fn new_entry_with_non_existing_path() {
        let path = Path::new("/path/to/nosuch.txt");
        let entry = Entry::new("nosuch", path);

        assert!(!entry.exists());
        assert!(entry.metadata.is_none());
    }

    #[test]
    fn new_entry_with_existing_path() {
        let path = Path::new(file!());
        let entry = Entry::new("entry.rs", path);

        assert!(entry.exists());
        assert!(entry.metadata.is_some());
        let is_link = entry.is_link();
        assert!(is_link.is_some());
        assert!(!is_link.unwrap());
    }
}