replace xxx-folder config props by mailboxes

This commit is contained in:
Clément DOUIN
2022-02-25 21:56:48 +01:00
parent 34ab0f4fa5
commit b855c44508
8 changed files with 56 additions and 57 deletions
+9 -2
View File
@@ -3,7 +3,7 @@ use std::{convert::TryInto, fs, path::PathBuf};
use crate::{
backends::{Backend, MaildirEnvelopes, MaildirFlags, MaildirMboxes},
config::{AccountConfig, MaildirBackendConfig},
config::{AccountConfig, MaildirBackendConfig, DEFAULT_INBOX_FOLDER},
mbox::Mboxes,
msg::{Envelopes, Msg},
};
@@ -36,7 +36,14 @@ impl<'a> MaildirBackend<'a> {
}
fn get_mdir_from_name(&self, mdir: &str) -> Result<maildir::Maildir> {
if mdir == self.account_config.inbox_folder {
let inbox_folder = self
.account_config
.mailboxes
.get("inbox")
.map(|s| s.as_str())
.unwrap_or(DEFAULT_INBOX_FOLDER);
if mdir == inbox_folder {
self.validate_mdir_path(self.mdir.path().to_owned())
.map(maildir::Maildir::from)
} else {
+5 -25
View File
@@ -2,7 +2,7 @@ use anyhow::{anyhow, Context, Result};
use lettre::transport::smtp::authentication::Credentials as SmtpCredentials;
use log::{debug, info, trace};
use mailparse::MailAddr;
use std::{env, ffi::OsStr, fs, path::PathBuf};
use std::{collections::HashMap, env, ffi::OsStr, fs, path::PathBuf};
use crate::{config::*, output::run_cmd};
@@ -23,12 +23,6 @@ pub struct AccountConfig {
pub sig: Option<String>,
/// Represents the default page size for listings.
pub default_page_size: usize,
/// Represents the inbox folder name for this account.
pub inbox_folder: String,
/// Represents the sent folder name for this account.
pub sent_folder: String,
/// Represents the draft folder name for this account.
pub draft_folder: String,
/// Represents the notify command.
pub notify_cmd: Option<String>,
/// Overrides the default IMAP query "NEW" used to fetch new messages
@@ -36,6 +30,9 @@ pub struct AccountConfig {
/// Represents the watch commands.
pub watch_cmds: Vec<String>,
/// Represents mailbox aliases.
pub mailboxes: HashMap<String, String>,
/// Represents the SMTP host.
pub smtp_host: String,
/// Represents the SMTP port.
@@ -137,24 +134,6 @@ impl<'a> AccountConfig {
downloads_dir,
sig,
default_page_size,
inbox_folder: base_account
.inbox_folder
.as_deref()
.or_else(|| config.inbox_folder.as_deref())
.unwrap_or(DEFAULT_INBOX_FOLDER)
.to_string(),
sent_folder: base_account
.sent_folder
.as_deref()
.or_else(|| config.sent_folder.as_deref())
.unwrap_or(DEFAULT_SENT_FOLDER)
.to_string(),
draft_folder: base_account
.draft_folder
.as_deref()
.or_else(|| config.draft_folder.as_deref())
.unwrap_or(DEFAULT_DRAFT_FOLDER)
.to_string(),
notify_cmd: base_account.notify_cmd.clone(),
notify_query: base_account
.notify_query
@@ -168,6 +147,7 @@ impl<'a> AccountConfig {
.or_else(|| config.watch_cmds.as_ref())
.unwrap_or(&vec![])
.to_owned(),
mailboxes: base_account.mailboxes.clone(),
default: base_account.default.unwrap_or_default(),
email: base_account.email.to_owned(),
+7 -10
View File
@@ -1,5 +1,5 @@
use serde::Deserialize;
use std::path::PathBuf;
use std::{collections::HashMap, path::PathBuf};
pub trait ToDeserializedBaseAccountConfig {
fn to_base(&self) -> DeserializedBaseAccountConfig;
@@ -39,12 +39,6 @@ macro_rules! make_account_config {
pub signature_delimiter: Option<String>,
/// Overrides the default page size for this account.
pub default_page_size: Option<usize>,
/// Overrides the inbox folder name for this account.
pub inbox_folder: Option<String>,
/// Overrides the sent folder name for this account.
pub sent_folder: Option<String>,
/// Overrides the draft folder name for this account.
pub draft_folder: Option<String>,
/// Overrides the notify command for this account.
pub notify_cmd: Option<String>,
/// Overrides the IMAP query used to fetch new messages for this account.
@@ -75,6 +69,10 @@ macro_rules! make_account_config {
/// Represents the command used to decrypt a message.
pub pgp_decrypt_cmd: Option<String>,
/// Represents mailbox aliases.
#[serde(default)]
pub mailboxes: HashMap<String, String>,
$(pub $element: $ty),*
}
@@ -86,9 +84,6 @@ macro_rules! make_account_config {
signature: self.signature.clone(),
signature_delimiter: self.signature_delimiter.clone(),
default_page_size: self.default_page_size.clone(),
inbox_folder: self.inbox_folder.clone(),
sent_folder: self.sent_folder.clone(),
draft_folder: self.draft_folder.clone(),
notify_cmd: self.notify_cmd.clone(),
notify_query: self.notify_query.clone(),
watch_cmds: self.watch_cmds.clone(),
@@ -105,6 +100,8 @@ macro_rules! make_account_config {
pgp_encrypt_cmd: self.pgp_encrypt_cmd.clone(),
pgp_decrypt_cmd: self.pgp_decrypt_cmd.clone(),
mailboxes: self.mailboxes.clone(),
}
}
}
+2 -8
View File
@@ -27,12 +27,6 @@ pub struct DeserializedConfig {
pub signature_delimiter: Option<String>,
/// Represents the default page size for listings.
pub default_page_size: Option<usize>,
/// Overrides the default inbox folder name "INBOX".
pub inbox_folder: Option<String>,
/// Overrides the default sent folder name "Sent".
pub sent_folder: Option<String>,
/// Overrides the default draft folder name "Drafts".
pub draft_folder: Option<String>,
/// Represents the notify command.
pub notify_cmd: Option<String>,
/// Overrides the default IMAP query "NEW" used to fetch new messages
@@ -48,12 +42,12 @@ pub struct DeserializedConfig {
impl DeserializedConfig {
/// Tries to create a config from an optional path.
pub fn from_opt_path(path: Option<&str>) -> Result<Self> {
info!("begin: trying to parse config from path");
info!("begin: try to parse config from path");
debug!("path: {:?}", path);
let path = path.map(|s| s.into()).unwrap_or(Self::path()?);
let content = fs::read_to_string(path).context("cannot read config file")?;
let config = toml::from_str(&content).context("cannot parse config file")?;
info!("end: trying to parse config from path");
info!("end: try to parse config from path");
trace!("config: {:?}", config);
Ok(config)
}
+6 -2
View File
@@ -5,7 +5,10 @@ use url::Url;
use himalaya::{
backends::{imap_arg, imap_handler, Backend, ImapBackend, MaildirBackend, NotmuchBackend},
compl::{compl_arg, compl_handler},
config::{account_args, config_args, AccountConfig, BackendConfig, DeserializedConfig},
config::{
account_args, config_args, AccountConfig, BackendConfig, DeserializedConfig,
DEFAULT_INBOX_FOLDER,
},
mbox::{mbox_arg, mbox_handler},
msg::{flag_arg, flag_handler, msg_arg, msg_handler, tpl_arg, tpl_handler},
output::{output_arg, OutputFmt, StdoutPrinter},
@@ -82,7 +85,8 @@ fn main() -> Result<()> {
AccountConfig::from_config_and_opt_account_name(&config, m.value_of("account"))?;
let mbox = m
.value_of("mbox-source")
.unwrap_or(&account_config.inbox_folder);
.or_else(|| account_config.mailboxes.get("inbox").map(|s| s.as_str()))
.unwrap_or(DEFAULT_INBOX_FOLDER);
let mut printer = StdoutPrinter::try_from(m.value_of("output"))?;
let mut imap;
let mut maildir;
+14 -7
View File
@@ -10,7 +10,7 @@ use uuid::Uuid;
use crate::{
backends::Backend,
config::{AccountConfig, DEFAULT_SIG_DELIM},
config::{AccountConfig, DEFAULT_DRAFT_FOLDER, DEFAULT_SENT_FOLDER, DEFAULT_SIG_DELIM},
msg::{
from_addrs_to_sendable_addrs, from_addrs_to_sendable_mbox, from_slice_to_addrs, msg_utils,
Addrs, BinaryPart, Part, Parts, TextPlainPart, TplOverride,
@@ -340,7 +340,12 @@ impl Msg {
match choice::post_edit() {
Ok(PostEditChoice::Send) => {
let sent_msg = smtp.send_msg(account, &self)?;
backend.add_msg(&account.sent_folder, &sent_msg.formatted(), "seen")?;
let sent_folder = account
.mailboxes
.get("sent")
.map(|s| s.as_str())
.unwrap_or(DEFAULT_SENT_FOLDER);
backend.add_msg(&sent_folder, &sent_msg.formatted(), "seen")?;
msg_utils::remove_local_draft()?;
printer.print("Message successfully sent")?;
break;
@@ -355,12 +360,14 @@ impl Msg {
}
Ok(PostEditChoice::RemoteDraft) => {
let tpl = self.to_tpl(TplOverride::default(), account)?;
backend.add_msg(&account.draft_folder, tpl.as_bytes(), "seen draft")?;
let draft_folder = account
.mailboxes
.get("draft")
.map(|s| s.as_str())
.unwrap_or(DEFAULT_DRAFT_FOLDER);
backend.add_msg(&draft_folder, tpl.as_bytes(), "seen draft")?;
msg_utils::remove_local_draft()?;
printer.print(format!(
"Message successfully saved to {}",
account.draft_folder
))?;
printer.print(format!("Message successfully saved to {}", draft_folder))?;
break;
}
Ok(PostEditChoice::Discard) => {
+9 -3
View File
@@ -16,7 +16,7 @@ use url::Url;
use crate::{
backends::Backend,
config::AccountConfig,
config::{AccountConfig, DEFAULT_SENT_FOLDER},
msg::{Msg, Part, Parts, TextPlainPart},
output::{PrintTableOpts, PrinterService},
smtp::SmtpService,
@@ -312,6 +312,13 @@ pub fn send<'a, P: PrinterService, B: Backend<'a> + ?Sized, S: SmtpService>(
let is_json = printer.is_json();
debug!("is json: {}", is_json);
let sent_folder = config
.mailboxes
.get("sent")
.map(|s| s.as_str())
.unwrap_or(DEFAULT_SENT_FOLDER);
debug!("sent folder: {:?}", sent_folder);
let raw_msg = if is_tty || is_json {
raw_msg.replace("\r", "").replace("\n", "\r\n")
} else {
@@ -325,9 +332,8 @@ pub fn send<'a, P: PrinterService, B: Backend<'a> + ?Sized, S: SmtpService>(
trace!("raw message: {:?}", raw_msg);
let envelope: lettre::address::Envelope = Msg::from_tpl(&raw_msg)?.try_into()?;
trace!("envelope: {:?}", envelope);
smtp.send_raw_msg(&envelope, raw_msg.as_bytes())?;
backend.add_msg(&config.sent_folder, raw_msg.as_bytes(), "seen")?;
backend.add_msg(&sent_folder, raw_msg.as_bytes(), "seen")?;
Ok(())
}