easychangedirectory/app/item/
read.rs

1use std::fs;
2use std::path::Path;
3
4use crate::app::{Item, ItemInfo};
5
6use super::_item::{ItemPath, ItemSymlink};
7
8pub fn read_items<P: AsRef<Path>>(path: P) -> anyhow::Result<Vec<ItemInfo>> {
9  let mut items = if let Ok(read_dir) = fs::read_dir(&path) {
10    read_dir
11      .filter_map(|entry| {
12        let entry = entry.ok()?;
13        let filepath = entry.path();
14        let path = if filepath.is_file() && filepath.is_symlink() {
15          ItemPath::Symlink(ItemSymlink::File(filepath))
16        } else if filepath.is_dir() && filepath.is_symlink() {
17          ItemPath::Symlink(ItemSymlink::Dir(filepath))
18        } else if filepath.is_file() {
19          ItemPath::File(filepath)
20        } else if filepath.is_dir() {
21          ItemPath::Dir(filepath)
22        } else {
23          ItemPath::Unknown(filepath)
24        };
25        Some(ItemInfo { item: Item::Path(path), index: Some(0) })
26      })
27      .collect::<Vec<_>>()
28  } else {
29    return Ok(vec![ItemInfo::default()]);
30  };
31
32  items.sort_by_key(|item| item.get_path());
33  Ok(
34    items
35      .iter_mut()
36      .enumerate()
37      .map(|(i, item)| {
38        item.index = Some(i);
39        item.clone()
40      })
41      .collect(),
42  )
43}