summaryrefslogtreecommitdiff
path: root/src/cmd/list.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/list.rs')
-rw-r--r--src/cmd/list.rs145
1 files changed, 0 insertions, 145 deletions
diff --git a/src/cmd/list.rs b/src/cmd/list.rs
deleted file mode 100644
index 8aeaf97..0000000
--- a/src/cmd/list.rs
+++ /dev/null
@@ -1,145 +0,0 @@
-use std::cmp::Reverse;
-
-use log::warn;
-
-use crate::cmd::{open_submaildir, MailStorage};
-use crate::de_jmhoffmann_jwebmail_mailstorage::{
- Call_List, ListMailHeader, MailHeader, Sort, Sort_direction, Sort_parameter,
-};
-use crate::rfc822::me_to_lmh;
-
-fn from_or_sender(mh: &MailHeader) -> &str {
- if mh.written_from.is_empty() {
- warn!("mail without from");
- panic!()
- }
- if mh.written_from.len() == 1 {
- &mh.written_from[0].address
- } else {
- &mh.sender.as_ref().unwrap().address
- }
-}
-
-fn mid_to_rec_time(mid: &str) -> f64 {
- let Some(dec) = mid.find('.') else {
- warn!("Invaild mail-id {}", mid);
- return 0.0;
- };
- let Some(sep) = mid[dec + 1..].find('.') else {
- return 0.0;
- };
- mid[..dec + 1 + sep]
- .parse()
- .or_else(|_| mid[..dec].parse())
- .unwrap_or(0.0)
-}
-
-fn sort_by_and_take(
- mut entries: Vec<maildir::MailEntry>,
- sortby: Sort,
- s: usize,
- e: usize,
-) -> Vec<ListMailHeader> {
- match sortby.parameter {
- Sort_parameter::date => match sortby.direction {
- Sort_direction::asc => {
- entries.sort_by(|a, b| {
- mid_to_rec_time(a.id())
- .partial_cmp(&mid_to_rec_time(b.id()))
- .unwrap()
- });
- entries
- .drain(s..e)
- .filter_map(|me| me_to_lmh(me).map_err(|e| warn!("{}", e)).ok())
- .collect()
- }
- Sort_direction::desc => {
- entries.sort_by(|b, a| {
- mid_to_rec_time(a.id())
- .partial_cmp(&mid_to_rec_time(b.id()))
- .unwrap()
- });
- entries
- .drain(s..e)
- .filter_map(|me| me_to_lmh(me).map_err(|e| warn!("{}", e)).ok())
- .collect()
- }
- },
- Sort_parameter::size => match sortby.direction {
- Sort_direction::asc => {
- entries.sort_by_cached_key(|a| a.path().metadata().map_or(0, |m| m.len()));
- entries
- .drain(s..e)
- .filter_map(|me| me_to_lmh(me).map_err(|e| warn!("{}", e)).ok())
- .collect()
- }
- Sort_direction::desc => {
- entries.sort_by_cached_key(|a| Reverse(a.path().metadata().map_or(0, |m| m.len())));
- entries
- .drain(s..e)
- .filter_map(|me| me_to_lmh(me).map_err(|e| warn!("{}", e)).ok())
- .collect()
- }
- },
- Sort_parameter::subject => {
- let mut x: Vec<ListMailHeader> = entries
- .drain(..)
- .filter_map(|me| me_to_lmh(me).map_err(|e| warn!("{}", e)).ok())
- .collect();
- match sortby.direction {
- Sort_direction::asc => x.sort_by(|a, b| a.header.subject.cmp(&b.header.subject)),
- Sort_direction::desc => x.sort_by(|b, a| a.header.subject.cmp(&b.header.subject)),
- }
- x.drain(s..e).collect()
- }
- Sort_parameter::sender => {
- let mut x: Vec<ListMailHeader> = entries
- .drain(..)
- .filter_map(|me| me_to_lmh(me).map_err(|e| warn!("{}", e)).ok())
- .collect();
- match sortby.direction {
- Sort_direction::asc => {
- x.sort_by(|a, b| from_or_sender(&a.header).cmp(from_or_sender(&b.header)))
- }
- Sort_direction::desc => {
- x.sort_by(|b, a| from_or_sender(&a.header).cmp(from_or_sender(&b.header)))
- }
- }
- x.drain(s..e).collect()
- }
- }
-}
-
-pub fn list(
- ms: &MailStorage,
- call: &mut dyn Call_List,
- folder: String,
- start: i64,
- end: i64,
- sort: Sort,
-) -> varlink::Result<()> {
- if let Some(path) = ms.maildir_path.read().unwrap().clone() {
- let md = open_submaildir(path, &folder);
-
- for r in md.list_new() {
- match r {
- Err(e) => warn!("{}", e),
- Ok(me) => {
- if let Err(e) = md.move_new_to_cur(me.id()) {
- warn!("{}", e);
- }
- }
- };
- }
-
- let a: Vec<_> = md.list_cur().filter_map(std::result::Result::ok).collect();
- let start = std::cmp::min(a.len(), start as usize);
- let end = std::cmp::min(a.len(), end as usize);
-
- let mail_heads = sort_by_and_take(a, sort, start, end);
-
- call.reply(mail_heads)
- } else {
- call.reply_not_initialized()
- }
-}