easychangedirectory/app/item/
read.rs1use 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}