From 8766d8862a8b9e1f0275dff51eb8cbebe9ad0f14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20DOUIN?= Date: Fri, 25 Feb 2022 23:31:03 +0100 Subject: [PATCH] impl notmuch get_envelopes --- src/backends/notmuch/notmuch_backend.rs | 88 ++++++++++++++++++------- 1 file changed, 63 insertions(+), 25 deletions(-) diff --git a/src/backends/notmuch/notmuch_backend.rs b/src/backends/notmuch/notmuch_backend.rs index 99ff475..4d31e33 100644 --- a/src/backends/notmuch/notmuch_backend.rs +++ b/src/backends/notmuch/notmuch_backend.rs @@ -1,6 +1,6 @@ use std::convert::TryInto; -use anyhow::{Context, Result}; +use anyhow::{anyhow, Context, Result}; use crate::{ backends::Backend, @@ -36,7 +36,7 @@ impl<'a> NotmuchBackend<'a> { } impl<'a> Backend<'a> for NotmuchBackend<'a> { - fn add_mbox(&mut self, mdir: &str) -> Result<()> { + fn add_mbox(&mut self, _mbox: &str) -> Result<()> { unimplemented!(); } @@ -44,70 +44,108 @@ impl<'a> Backend<'a> for NotmuchBackend<'a> { unimplemented!(); } - fn del_mbox(&mut self, mdir: &str) -> Result<()> { + fn del_mbox(&mut self, _mbox: &str) -> Result<()> { unimplemented!(); } fn get_envelopes( &mut self, - mdir: &str, + mbox: &str, page_size: usize, page: usize, ) -> Result> { - unimplemented!(); - } - - fn find_envelopes( - &mut self, - _mdir: &str, - query: &str, - _sort: &str, - _page_size: usize, - _page: usize, - ) -> Result> { + let query = self + .account_config + .mailboxes + .get(mbox) + .map(|s| s.as_str()) + .unwrap_or("all"); let query_builder = self .db .create_query(query) .context("cannot create notmuch query")?; - let msgs: NotmuchEnvelopes = query_builder + let mut envelopes: NotmuchEnvelopes = query_builder .search_messages() .context(format!( "cannot find notmuch envelopes with query {:?}", query ))? .try_into()?; - Ok(Box::new(msgs)) + envelopes.sort_by(|a, b| b.date.partial_cmp(&a.date).unwrap()); + let page_begin = page * page_size; + if page_begin > envelopes.len() { + return Err(anyhow!(format!( + "cannot find notmuch envelopes at page {:?} (out of bounds)", + page_begin + 1, + ))); + } + let page_end = envelopes.len().min(page_begin + page_size); + envelopes.0 = envelopes[page_begin..page_end].to_owned(); + Ok(Box::new(envelopes)) } - fn add_msg(&mut self, mdir: &str, msg: &[u8], flags: &str) -> Result> { + fn find_envelopes( + &mut self, + _mbox: &str, + query: &str, + _sort: &str, + page_size: usize, + page: usize, + ) -> Result> { + let query_builder = self + .db + .create_query(query) + .context("cannot create notmuch query")?; + let mut envelopes: NotmuchEnvelopes = query_builder + .search_messages() + .context(format!( + "cannot find notmuch envelopes with query {:?}", + query + ))? + .try_into()?; + // TODO: use sort from parameters instead + envelopes.sort_by(|a, b| b.date.partial_cmp(&a.date).unwrap()); + let page_begin = page * page_size; + if page_begin > envelopes.len() { + return Err(anyhow!(format!( + "cannot find notmuch envelopes at page {:?} (out of bounds)", + page_begin + 1, + ))); + } + let page_end = envelopes.len().min(page_begin + page_size); + envelopes.0 = envelopes[page_begin..page_end].to_owned(); + Ok(Box::new(envelopes)) + } + + fn add_msg(&mut self, _mbox: &str, _msg: &[u8], _flags: &str) -> Result> { unimplemented!(); } - fn get_msg(&mut self, mdir: &str, id: &str) -> Result { + fn get_msg(&mut self, _mbox: &str, _id: &str) -> Result { unimplemented!(); } - fn copy_msg(&mut self, mdir_src: &str, mdir_dst: &str, id: &str) -> Result<()> { + fn copy_msg(&mut self, _mbox_src: &str, _mbox_dst: &str, _id: &str) -> Result<()> { unimplemented!(); } - fn move_msg(&mut self, mdir_src: &str, mdir_dst: &str, id: &str) -> Result<()> { + fn move_msg(&mut self, _mbox_src: &str, _mbox_dst: &str, _id: &str) -> Result<()> { unimplemented!(); } - fn del_msg(&mut self, mdir: &str, id: &str) -> Result<()> { + fn del_msg(&mut self, _mbox: &str, _id: &str) -> Result<()> { unimplemented!(); } - fn add_flags(&mut self, mdir: &str, id: &str, flags_str: &str) -> Result<()> { + fn add_flags(&mut self, _mbox: &str, _id: &str, _flags_str: &str) -> Result<()> { unimplemented!(); } - fn set_flags(&mut self, mdir: &str, id: &str, flags_str: &str) -> Result<()> { + fn set_flags(&mut self, _mbox: &str, _id: &str, _flags_str: &str) -> Result<()> { unimplemented!(); } - fn del_flags(&mut self, mdir: &str, id: &str, flags_str: &str) -> Result<()> { + fn del_flags(&mut self, _mbox: &str, _id: &str, _flags_str: &str) -> Result<()> { unimplemented!(); } }