Add special use semantics for mailboxes
parent
76909a1959
commit
b474b44b10
|
@ -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;
|
||||
|
|
|
@ -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};
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue