Add special use semantics for mailboxes

embed
Manos Pitsidianakis 2019-08-23 21:58:41 +03:00
parent 76909a1959
commit b474b44b10
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
4 changed files with 54 additions and 9 deletions

View File

@ -245,6 +245,18 @@ impl BackendOp for ReadOnlyOp {
}
}
#[derive(Debug, Copy, Hash, Eq, Clone, Deserialize, PartialEq)]
pub enum SpecialUseMailbox {
Normal,
Inbox,
Archive,
Drafts,
Flagged,
Junk,
Sent,
Trash,
}
pub trait BackendFolder: Debug {
fn hash(&self) -> FolderHash;
fn name(&self) -> &str;

View File

@ -120,7 +120,7 @@ extern crate uuid;
pub use crate::conf::*;
pub use crate::mailbox::*;
pub use crate::backends::{Backends, RefreshEvent, RefreshEventConsumer};
pub use crate::backends::{Backends, RefreshEvent, RefreshEventConsumer, SpecialUseMailbox};
pub use crate::email::{Envelope, Flag};
pub use crate::error::{MeliError, Result};

View File

@ -38,6 +38,7 @@ pub use self::shortcuts::*;
use self::default_vals::*;
use self::notifications::NotificationsSettings;
use crate::pager::PagerSettings;
use melib::backends::SpecialUseMailbox;
use melib::conf::AccountSettings;
use melib::error::*;
@ -97,6 +98,8 @@ pub struct FolderConf {
subscribe: ToggleFlag,
#[serde(deserialize_with = "toggleflag_de", default)]
ignore: ToggleFlag,
#[serde(default = "none")]
usage: Option<SpecialUseMailbox>,
}
impl Default for FolderConf {
@ -106,6 +109,7 @@ impl Default for FolderConf {
autoload: true,
subscribe: ToggleFlag::Unset,
ignore: ToggleFlag::False,
usage: None,
}
}
}
@ -188,6 +192,34 @@ impl From<FileAccount> for AccountConf {
}
folder_confs.get_mut(s).unwrap().subscribe = ToggleFlag::True;
}
if folder_confs[s].usage.is_none() {
let name = s.split('/').last().unwrap_or("");
folder_confs.get_mut(s).unwrap().usage = if name.eq_ignore_ascii_case("inbox") {
Some(SpecialUseMailbox::Inbox)
} else if name.eq_ignore_ascii_case("archive") {
Some(SpecialUseMailbox::Archive)
} else if name.eq_ignore_ascii_case("drafts") {
Some(SpecialUseMailbox::Drafts)
} else if name.eq_ignore_ascii_case("junk") {
Some(SpecialUseMailbox::Junk)
} else if name.eq_ignore_ascii_case("spam") {
Some(SpecialUseMailbox::Junk)
} else if name.eq_ignore_ascii_case("sent") {
Some(SpecialUseMailbox::Sent)
} else if name.eq_ignore_ascii_case("trash") {
Some(SpecialUseMailbox::Trash)
} else {
Some(SpecialUseMailbox::Normal)
};
}
if folder_confs[s].ignore.is_unset() {
use SpecialUseMailbox::*;
if [Junk, Sent, Trash].contains(&folder_confs[s].usage.as_ref().unwrap()) {
folder_confs.get_mut(s).unwrap().ignore = ToggleFlag::InternalVal(true);
}
}
}
AccountConf {

View File

@ -24,12 +24,11 @@
*/
use super::AccountConf;
use super::ToggleFlag;
use fnv::FnvHashMap;
use melib::async_workers::{Async, AsyncBuilder, AsyncStatus};
use melib::backends::{
BackendOp, Backends, Folder, FolderHash, MailBackend, NotifyFn, ReadOnlyOp, RefreshEvent,
RefreshEventConsumer, RefreshEventKind,
RefreshEventConsumer, RefreshEventKind, SpecialUseMailbox,
};
use melib::error::{MeliError, Result};
use melib::mailbox::*;
@ -189,12 +188,7 @@ struct FolderNode {
}
impl Account {
pub fn new(
name: String,
mut settings: AccountConf,
map: &Backends,
notify_fn: NotifyFn,
) -> Self {
pub fn new(name: String, settings: AccountConf, map: &Backends, notify_fn: NotifyFn) -> Self {
let mut backend = map.get(settings.account().format())(settings.account());
let mut ref_folders: FnvHashMap<FolderHash, Folder> = backend.folders();
let mut folders: FnvHashMap<FolderHash, MailboxEntry> =
@ -212,6 +206,13 @@ impl Account {
/* Skip unsubscribed folder */
continue;
}
match settings.folder_confs[f.path()].usage {
Some(SpecialUseMailbox::Sent) => {
sent_folder = Some(f.hash());
}
_ => {}
}
folder_names.insert(f.hash(), f.path().to_string());
}