cargo_plot/core/path_view/
node.rs1use crate::core::path_matcher::SortStrategy;
2use std::path::PathBuf;
3
4#[derive(Debug, Clone)]
6pub struct FileNode {
7 pub name: String,
8 pub path: PathBuf,
9 pub is_dir: bool,
10 pub icon: String,
11 pub weight_str: String,
12 pub weight_bytes: u64,
13 pub children: Vec<FileNode>,
14}
15
16impl FileNode {
17 pub fn sort_slice(nodes: &mut [FileNode], strategy: SortStrategy) {
19 if strategy == SortStrategy::None {
20 return;
21 }
22
23 nodes.sort_by(|a, b| {
24 let a_is_dir = a.is_dir;
25 let b_is_dir = b.is_dir;
26
27 let a_merge = Self::get_merge_key(&a.name);
29 let b_merge = Self::get_merge_key(&b.name);
30
31 match strategy {
32 SortStrategy::Az => a.name.cmp(&b.name),
34 SortStrategy::Za => b.name.cmp(&a.name),
35
36 SortStrategy::AzFileFirst => (a_is_dir, &a.name).cmp(&(b_is_dir, &b.name)),
38 SortStrategy::ZaFileFirst => (a_is_dir, &b.name).cmp(&(b_is_dir, &a.name)),
39
40 SortStrategy::AzDirFirst => (!a_is_dir, &a.name).cmp(&(!b_is_dir, &b.name)),
42 SortStrategy::ZaDirFirst => (!a_is_dir, &b.name).cmp(&(!b_is_dir, &a.name)),
43
44 SortStrategy::AzFileFirstMerge => {
46 (a_merge, a_is_dir, &a.name).cmp(&(b_merge, b_is_dir, &b.name))
47 }
48 SortStrategy::ZaFileFirstMerge => {
49 (b_merge, a_is_dir, &b.name).cmp(&(a_merge, b_is_dir, &a.name))
50 }
51
52 SortStrategy::AzDirFirstMerge => (!a_is_dir, &a.name).cmp(&(!b_is_dir, &b.name)),
54 SortStrategy::ZaDirFirstMerge => (!a_is_dir, &b.name).cmp(&(!b_is_dir, &a.name)),
55
56 _ => a.name.cmp(&b.name),
57 }
58 });
59 }
60
61 fn get_merge_key(name: &str) -> &str {
63 if let Some(idx) = name.rfind('.')
64 && idx > 0
65 {
66 return &name[..idx];
67 }
68 name
69 }
70}