From 520b9c5695614cbef4f98a6619a6e60cbd1fc4f1 Mon Sep 17 00:00:00 2001 From: yggverse Date: Wed, 25 Jun 2025 11:11:19 +0300 Subject: [PATCH] implement list sort options --- README.md | 24 ++++++++++++++++++++ src/config.rs | 32 ++++++++++++++++++++++++++ src/session/storage.rs | 36 +++++++++++++++++++++++++----- src/session/storage/list_config.rs | 18 ++++++++++++++- 4 files changed, 103 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e7c2c20..cd43a0e 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,18 @@ nexy -p /path/to/public_dir --list-dir-modified 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 Sort directories in list DESC (ASC by default) @@ -104,6 +116,18 @@ nexy -p /path/to/public_dir --list-file-modified 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 Sort files in list DESC (ASC by default) diff --git a/src/config.rs b/src/config.rs index d9f2403..bdec844 100644 --- a/src/config.rs +++ b/src/config.rs @@ -84,6 +84,22 @@ pub struct Config { #[arg(long, default_value_t = false)] 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) #[arg(long, default_value_t = false)] pub list_dir_reverse: bool, @@ -104,6 +120,22 @@ pub struct Config { #[arg(long, default_value_t = false)] 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) #[arg(long, default_value_t = false)] pub list_file_reverse: bool, diff --git a/src/session/storage.rs b/src/session/storage.rs index 373a365..2f4a49f 100644 --- a/src/session/storage.rs +++ b/src/session/storage.rs @@ -145,13 +145,25 @@ impl Storage { r.push("=> ../".to_string()) } // format dirs list - dirs.sort_by(|a, b| a.name.cmp(&b.name)); - if self.list_config.dir.is_reverse { + let dc = &self.list_config.dir; // just short alias + 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() } for dir in dirs { r.push({ - let dc = &self.list_config.dir; // just short alias let mut l = format!("=> {}/", encode(&dir.name)); // link let mut a = Vec::new(); // alt if dc.is_count { @@ -174,13 +186,25 @@ impl Storage { }) } // format files list - files.sort_by(|a, b| a.name.cmp(&b.name)); - if self.list_config.file.is_reverse { + let fc = &self.list_config.file; // just short alias + 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() } for file in files { r.push({ - let fc = &self.list_config.file; // just short alias let mut l = format!("=> {}", encode(&file.name)); // link let mut a = Vec::new(); // alt if fc.is_size { diff --git a/src/session/storage/list_config.rs b/src/session/storage/list_config.rs index bf6076c..44c595a 100644 --- a/src/session/storage/list_config.rs +++ b/src/session/storage/list_config.rs @@ -7,11 +7,19 @@ pub struct Time { pub struct Dir { pub is_count: 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 struct File { pub is_reverse: 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, } @@ -32,6 +40,10 @@ impl ListConfig { }, is_count: config.list_dir_count, 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 { time: Time { @@ -39,8 +51,12 @@ impl ListConfig { is_created: config.list_file_created, is_modified: config.list_file_modified, }, - is_size: config.list_file_size, 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(), }