use crate::entry::Entry;
use crate::util::parent_dir;
#[derive(Clone, Copy)]
#[cfg_attr(feature = "cli", derive(clap::ValueEnum))]
pub enum Sort {
Name,
Modified,
Size,
Extension,
}
pub fn sort_entries(entries: &mut [Entry], sort: Sort, dirs_first: bool) {
let mut start = 0;
while start < entries.len() {
let parent = parent_dir(&entries[start].relative_path);
let mut end = start + 1;
while end < entries.len() && parent_dir(&entries[end].relative_path) == parent {
end += 1;
}
entries[start..end].sort_by(|a, b| {
if dirs_first {
let dir_ord = b.is_dir.cmp(&a.is_dir);
if dir_ord != std::cmp::Ordering::Equal {
return dir_ord;
}
}
match sort {
Sort::Name => natord::compare(a.name(), b.name()),
Sort::Modified => b.modified.cmp(&a.modified),
Sort::Size => b.size.cmp(&a.size),
Sort::Extension => {
let a_ext = a.extension().unwrap_or("");
let b_ext = b.extension().unwrap_or("");
a_ext
.cmp(b_ext)
.then_with(|| natord::compare(a.name(), b.name()))
}
}
});
start = end;
}
}