rls-analysis 0.18.3

Library for processing rustc's save-analysis data for the RLS
Documentation
use std::io;
use std::path::Path;
use std::time::SystemTime;

#[derive(Debug, Clone)]
pub struct DirectoryListing {
    pub path: Vec<String>,
    pub files: Vec<Listing>,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
pub struct Listing {
    pub kind: ListingKind,
    pub name: String,
}

#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
pub enum ListingKind {
    Directory,
    // Time last modified.
    File(SystemTime),
}

impl DirectoryListing {
    pub fn from_path(path: &Path) -> io::Result<DirectoryListing> {
        let mut files = vec![];
        let dir = path.read_dir()?;

        for entry in dir {
            if let Ok(entry) = entry {
                let name = entry.file_name().to_str().unwrap().to_owned();
                if let Ok(file_type) = entry.file_type() {
                    if file_type.is_dir() {
                        files.push(Listing { kind: ListingKind::Directory, name });
                    } else if file_type.is_file() {
                        files.push(Listing {
                            kind: ListingKind::File(entry.metadata()?.modified()?),
                            name,
                        });
                    }
                }
            }
        }

        files.sort();

        Ok(DirectoryListing {
            path: path.components().map(|c| c.as_os_str().to_str().unwrap().to_owned()).collect(),
            files,
        })
    }
}