Skip to main content

cargo_plot/core/path_view/
node.rs

1use crate::core::path_matcher::SortStrategy;
2use std::path::PathBuf;
3
4/// [POL]: Reprezentuje pojedynczy węzeł w drzewie systemu plików.
5#[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    /// [POL]: Sortuje listę węzłów w miejscu zgodnie z wybraną strategią.
18    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            // Klucz Merge: "interfaces.rs" -> "interfaces", "interfaces/" -> "interfaces"
28            let a_merge = Self::get_merge_key(&a.name);
29            let b_merge = Self::get_merge_key(&b.name);
30
31            match strategy {
32                // 1. CZYSTE ALFANUMERYCZNE
33                SortStrategy::Az => a.name.cmp(&b.name),
34                SortStrategy::Za => b.name.cmp(&a.name),
35
36                // 2. PLIKI PIERWSZE (Globalnie)
37                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                // 3. KATALOGI PIERWSZE (Globalnie)
41                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                // 4. PLIKI PIERWSZE + MERGE (Grupowanie modułów)
45                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                // 5. KATALOGI PIERWSZE + MERGE (Zgodnie z Twoją notatką: fallback do DirFirst)
53                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    /// [POL]: Wyciąga rdzeń nazwy do grupowania (np. "main.rs" -> "main").
62    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}