implement list sort options

This commit is contained in:
yggverse 2025-06-25 11:11:19 +03:00
parent 0a22d1388c
commit 520b9c5695
4 changed files with 103 additions and 7 deletions

View file

@ -89,6 +89,18 @@ nexy -p /path/to/public_dir
--list-dir-modified --list-dir-modified
Show directory modified time Show directory modified time
--list-dir-sort-accessed
Sort dirs by time accessed (name by default)
--list-dir-sort-created
Sort dirs by time created (name by default)
--list-dir-sort-modified
Sort dirs by time modified (name by default)
--list-dir-sort-count
Sort dirs by count (name by default)
--list-dir-reverse --list-dir-reverse
Sort directories in list DESC (ASC by default) Sort directories in list DESC (ASC by default)
@ -104,6 +116,18 @@ nexy -p /path/to/public_dir
--list-file-modified --list-file-modified
Show file modified time Show file modified time
--list-file-sort-accessed
Sort files by time accessed (name by default)
--list-file-sort-created
Sort files by time created (name by default)
--list-file-sort-modified
Sort files by time modified (name by default)
--list-file-sort-size
Sort files by size (name by default)
--list-file-reverse --list-file-reverse
Sort files in list DESC (ASC by default) Sort files in list DESC (ASC by default)

View file

@ -84,6 +84,22 @@ pub struct Config {
#[arg(long, default_value_t = false)] #[arg(long, default_value_t = false)]
pub list_dir_modified: bool, pub list_dir_modified: bool,
/// Sort dirs by time accessed (name by default)
#[arg(long, default_value_t = false)]
pub list_dir_sort_accessed: bool,
/// Sort dirs by time created (name by default)
#[arg(long, default_value_t = false)]
pub list_dir_sort_created: bool,
/// Sort dirs by time modified (name by default)
#[arg(long, default_value_t = false)]
pub list_dir_sort_modified: bool,
/// Sort dirs by count (name by default)
#[arg(long, default_value_t = false)]
pub list_dir_sort_count: bool,
/// Sort directories in list DESC (ASC by default) /// Sort directories in list DESC (ASC by default)
#[arg(long, default_value_t = false)] #[arg(long, default_value_t = false)]
pub list_dir_reverse: bool, pub list_dir_reverse: bool,
@ -104,6 +120,22 @@ pub struct Config {
#[arg(long, default_value_t = false)] #[arg(long, default_value_t = false)]
pub list_file_modified: bool, pub list_file_modified: bool,
/// Sort files by time accessed (name by default)
#[arg(long, default_value_t = false)]
pub list_file_sort_accessed: bool,
/// Sort files by time created (name by default)
#[arg(long, default_value_t = false)]
pub list_file_sort_created: bool,
/// Sort files by time modified (name by default)
#[arg(long, default_value_t = false)]
pub list_file_sort_modified: bool,
/// Sort files by size (name by default)
#[arg(long, default_value_t = false)]
pub list_file_sort_size: bool,
/// Sort files in list DESC (ASC by default) /// Sort files in list DESC (ASC by default)
#[arg(long, default_value_t = false)] #[arg(long, default_value_t = false)]
pub list_file_reverse: bool, pub list_file_reverse: bool,

View file

@ -145,13 +145,25 @@ impl Storage {
r.push("=> ../".to_string()) r.push("=> ../".to_string())
} }
// format dirs list // format dirs list
dirs.sort_by(|a, b| a.name.cmp(&b.name)); let dc = &self.list_config.dir; // just short alias
if self.list_config.dir.is_reverse { dirs.sort_by(|a, b| {
if dc.is_sort_accessed {
a.meta.atime().cmp(&b.meta.atime())
} else if dc.is_sort_created {
a.meta.ctime().cmp(&b.meta.ctime())
} else if dc.is_sort_modified {
a.meta.mtime().cmp(&b.meta.mtime())
} else if dc.is_sort_count {
a.meta.size().cmp(&b.meta.size())
} else {
a.name.cmp(&b.name)
}
});
if dc.is_reverse {
dirs.reverse() dirs.reverse()
} }
for dir in dirs { for dir in dirs {
r.push({ r.push({
let dc = &self.list_config.dir; // just short alias
let mut l = format!("=> {}/", encode(&dir.name)); // link let mut l = format!("=> {}/", encode(&dir.name)); // link
let mut a = Vec::new(); // alt let mut a = Vec::new(); // alt
if dc.is_count { if dc.is_count {
@ -174,13 +186,25 @@ impl Storage {
}) })
} }
// format files list // format files list
files.sort_by(|a, b| a.name.cmp(&b.name)); let fc = &self.list_config.file; // just short alias
if self.list_config.file.is_reverse { files.sort_by(|a, b| {
if fc.is_sort_accessed {
a.meta.atime().cmp(&b.meta.atime())
} else if fc.is_sort_created {
a.meta.ctime().cmp(&b.meta.ctime())
} else if fc.is_sort_modified {
a.meta.mtime().cmp(&b.meta.mtime())
} else if fc.is_sort_size {
a.meta.size().cmp(&b.meta.size())
} else {
a.name.cmp(&b.name)
}
});
if fc.is_reverse {
files.reverse() files.reverse()
} }
for file in files { for file in files {
r.push({ r.push({
let fc = &self.list_config.file; // just short alias
let mut l = format!("=> {}", encode(&file.name)); // link let mut l = format!("=> {}", encode(&file.name)); // link
let mut a = Vec::new(); // alt let mut a = Vec::new(); // alt
if fc.is_size { if fc.is_size {

View file

@ -7,11 +7,19 @@ pub struct Time {
pub struct Dir { pub struct Dir {
pub is_count: bool, pub is_count: bool,
pub is_reverse: bool, pub is_reverse: bool,
pub is_sort_accessed: bool,
pub is_sort_count: bool,
pub is_sort_created: bool,
pub is_sort_modified: bool,
pub time: Time, pub time: Time,
} }
pub struct File { pub struct File {
pub is_reverse: bool, pub is_reverse: bool,
pub is_size: bool, pub is_size: bool,
pub is_sort_accessed: bool,
pub is_sort_created: bool,
pub is_sort_modified: bool,
pub is_sort_size: bool,
pub time: Time, pub time: Time,
} }
@ -32,6 +40,10 @@ impl ListConfig {
}, },
is_count: config.list_dir_count, is_count: config.list_dir_count,
is_reverse: config.list_dir_reverse, is_reverse: config.list_dir_reverse,
is_sort_accessed: config.list_dir_sort_accessed,
is_sort_created: config.list_dir_sort_created,
is_sort_modified: config.list_dir_sort_modified,
is_sort_count: config.list_dir_sort_count,
}, },
file: File { file: File {
time: Time { time: Time {
@ -39,8 +51,12 @@ impl ListConfig {
is_created: config.list_file_created, is_created: config.list_file_created,
is_modified: config.list_file_modified, is_modified: config.list_file_modified,
}, },
is_size: config.list_file_size,
is_reverse: config.list_file_reverse, is_reverse: config.list_file_reverse,
is_size: config.list_file_size,
is_sort_accessed: config.list_file_sort_accessed,
is_sort_created: config.list_file_sort_created,
is_sort_modified: config.list_file_sort_modified,
is_sort_size: config.list_file_sort_size,
}, },
time_format: config.list_time_format.clone(), time_format: config.list_time_format.clone(),
} }