improve folder alias management

This commit is contained in:
Clément DOUIN 2023-12-15 22:54:13 +01:00
parent bcef05a54c
commit 6942c59097
No known key found for this signature in database
GPG key ID: 353E4A18EE0FAB72
8 changed files with 37 additions and 33 deletions

2
Cargo.lock generated
View file

@ -1246,7 +1246,7 @@ dependencies = [
[[package]] [[package]]
name = "email-lib" name = "email-lib"
version = "0.17.1" version = "0.17.1"
source = "git+https://git.sr.ht/~soywod/pimalaya#9b69f07b6278550d74b8ba5afd2618a57c6225af" source = "git+https://git.sr.ht/~soywod/pimalaya#da6c3e9834c5e2071a66a6b7e3e71a8eddc73766"
dependencies = [ dependencies = [
"advisory-lock", "advisory-lock",
"anyhow", "anyhow",

View file

@ -11,6 +11,19 @@ pub struct AccountNameArg {
pub name: String, pub name: String,
} }
/// The optional account name argument parser.
#[derive(Debug, Parser)]
pub struct OptionalAccountNameArg {
/// The name of the account.
///
/// An account name corresponds to an entry in the table at the
/// root level of your TOML configuration file.
///
/// If omitted, the account marked as default will be used.
#[arg(name = "account_name", value_name = "ACCOUNT")]
pub name: Option<String>,
}
/// The account name flag parser. /// The account name flag parser.
#[derive(Debug, Default, Parser)] #[derive(Debug, Default, Parser)]
pub struct AccountNameFlag { pub struct AccountNameFlag {

View file

@ -13,7 +13,7 @@ use std::{
}; };
use crate::{ use crate::{
account::arg::name::AccountNameArg, backend::BackendBuilder, config::TomlConfig, account::arg::name::OptionalAccountNameArg, backend::BackendBuilder, config::TomlConfig,
printer::Printer, printer::Printer,
}; };
@ -40,7 +40,7 @@ const SUB_PROGRESS_DONE_STYLE: Lazy<ProgressStyle> = Lazy::new(|| {
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
pub struct AccountSyncCommand { pub struct AccountSyncCommand {
#[command(flatten)] #[command(flatten)]
pub account: AccountNameArg, pub account: OptionalAccountNameArg,
/// Run the synchronization without applying any changes. /// Run the synchronization without applying any changes.
/// ///
@ -95,9 +95,10 @@ impl AccountSyncCommand {
None None
}; };
let (toml_account_config, account_config) = config let account = self.account.name.as_ref().map(String::as_str);
.clone() let (toml_account_config, account_config) =
.into_account_configs(Some(self.account.name.as_str()), true)?; config.clone().into_account_configs(account, true)?;
let account_name = account_config.name.as_str();
let backend_builder = let backend_builder =
BackendBuilder::new(toml_account_config, account_config.clone(), false).await?; BackendBuilder::new(toml_account_config, account_config.clone(), false).await?;
@ -128,15 +129,11 @@ impl AccountSyncCommand {
} }
printer.print(format!( printer.print(format!(
"Estimated patch length for account {} to be synchronized: {hunks_count}", "Estimated patch length for account {account_name} to be synchronized: {hunks_count}"
self.account.name
))?; ))?;
} else if printer.is_json() { } else if printer.is_json() {
sync_builder.sync().await?; sync_builder.sync().await?;
printer.print(format!( printer.print(format!("Account {account_name} successfully synchronized!"))?;
"Account {} successfully synchronized!",
self.account.name
))?;
} else { } else {
let multi = MultiProgress::new(); let multi = MultiProgress::new();
let sub_progresses = Mutex::new(HashMap::new()); let sub_progresses = Mutex::new(HashMap::new());
@ -247,10 +244,7 @@ impl AccountSyncCommand {
))?; ))?;
} }
printer.print(format!( printer.print(format!("Account {account_name} successfully synchronized!"))?;
"Account {} successfully synchronized!",
self.account.name
))?;
} }
Ok(()) Ok(())

2
src/cache/mod.rs vendored
View file

@ -36,7 +36,7 @@ impl IdMapper {
} }
pub fn new(account_config: &AccountConfig, folder: &str, db_path: PathBuf) -> Result<Self> { pub fn new(account_config: &AccountConfig, folder: &str, db_path: PathBuf) -> Result<Self> {
let folder = account_config.get_folder_alias(folder)?; let folder = account_config.get_folder_alias(folder);
let digest = md5::compute(account_config.name.clone() + &folder); let digest = md5::compute(account_config.name.clone() + &folder);
let table = format!("id_mapper_{digest:x}"); let table = format!("id_mapper_{digest:x}");
debug!("creating id mapper table {table} at {db_path:?}…"); debug!("creating id mapper table {table} at {db_path:?}…");

View file

@ -1,6 +1,6 @@
use anyhow::Result; use anyhow::Result;
use clap::Parser; use clap::Parser;
use email::flag::Flag; use email::{flag::Flag, folder::SENT};
use log::info; use log::info;
use std::io::{self, BufRead, IsTerminal}; use std::io::{self, BufRead, IsTerminal};
@ -35,7 +35,6 @@ impl MessageSendCommand {
let (toml_account_config, account_config) = let (toml_account_config, account_config) =
config.clone().into_account_configs(account, cache)?; config.clone().into_account_configs(account, cache)?;
let backend = Backend::new(toml_account_config, account_config.clone(), true).await?; let backend = Backend::new(toml_account_config, account_config.clone(), true).await?;
let folder = account_config.get_sent_folder_alias()?;
let is_tty = io::stdin().is_terminal(); let is_tty = io::stdin().is_terminal();
let is_json = printer.is_json(); let is_json = printer.is_json();
@ -54,10 +53,9 @@ impl MessageSendCommand {
if account_config.should_save_copy_sent_message() { if account_config.should_save_copy_sent_message() {
backend backend
.add_raw_message_with_flag(&folder, msg.as_bytes(), Flag::Seen) .add_raw_message_with_flag(SENT, msg.as_bytes(), Flag::Seen)
.await?; .await?;
printer.print("Message successfully sent and saved to the Sent folder!")
printer.print(format!("Message successfully sent and saved to {folder}!"))
} else { } else {
printer.print("Message successfully sent!") printer.print("Message successfully sent!")
} }

View file

@ -1,6 +1,6 @@
use anyhow::Result; use anyhow::Result;
use clap::Parser; use clap::Parser;
use email::flag::Flag; use email::{flag::Flag, folder::SENT};
use log::info; use log::info;
use mml::MmlCompilerBuilder; use mml::MmlCompilerBuilder;
use std::io::{self, BufRead, IsTerminal}; use std::io::{self, BufRead, IsTerminal};
@ -38,7 +38,6 @@ impl TemplateSendCommand {
let (toml_account_config, account_config) = let (toml_account_config, account_config) =
config.clone().into_account_configs(account, cache)?; config.clone().into_account_configs(account, cache)?;
let backend = Backend::new(toml_account_config, account_config.clone(), true).await?; let backend = Backend::new(toml_account_config, account_config.clone(), true).await?;
let folder = account_config.get_sent_folder_alias()?;
let is_tty = io::stdin().is_terminal(); let is_tty = io::stdin().is_terminal();
let is_json = printer.is_json(); let is_json = printer.is_json();
@ -65,10 +64,10 @@ impl TemplateSendCommand {
if account_config.should_save_copy_sent_message() { if account_config.should_save_copy_sent_message() {
backend backend
.add_raw_message_with_flag(&folder, &msg, Flag::Seen) .add_raw_message_with_flag(SENT, &msg, Flag::Seen)
.await?; .await?;
printer.print(format!("Template successfully sent and saved to {folder}!")) printer.print("Template successfully sent and saved to the Sent folder!")
} else { } else {
printer.print("Template successfully sent!") printer.print("Template successfully sent!")
} }

View file

@ -1,12 +1,12 @@
use clap::Parser; use clap::Parser;
use email::account::config::DEFAULT_INBOX_FOLDER; use email::folder::INBOX;
/// The optional folder name flag parser. /// The optional folder name flag parser.
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
pub struct FolderNameOptionalFlag { pub struct FolderNameOptionalFlag {
/// The name of the folder. /// The name of the folder.
#[arg(long = "folder", short = 'f')] #[arg(long = "folder", short = 'f')]
#[arg(name = "folder_name", value_name = "NAME", default_value = DEFAULT_INBOX_FOLDER)] #[arg(name = "folder_name", value_name = "NAME", default_value = INBOX)]
pub name: String, pub name: String,
} }
@ -14,7 +14,7 @@ pub struct FolderNameOptionalFlag {
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
pub struct FolderNameOptionalArg { pub struct FolderNameOptionalArg {
/// The name of the folder. /// The name of the folder.
#[arg(name = "folder_name", value_name = "FOLDER", default_value = DEFAULT_INBOX_FOLDER)] #[arg(name = "folder_name", value_name = "FOLDER", default_value = INBOX)]
pub name: String, pub name: String,
} }

View file

@ -3,6 +3,7 @@ use email::{
account::config::AccountConfig, account::config::AccountConfig,
email::utils::{local_draft_path, remove_local_draft}, email::utils::{local_draft_path, remove_local_draft},
flag::{Flag, Flags}, flag::{Flag, Flags},
folder::{DRAFTS, SENT},
}; };
use log::debug; use log::debug;
use mml::MmlCompilerBuilder; use mml::MmlCompilerBuilder;
@ -90,10 +91,9 @@ pub async fn edit_tpl_with_editor<P: Printer>(
backend.send_raw_message(&email).await?; backend.send_raw_message(&email).await?;
if config.should_save_copy_sent_message() { if config.should_save_copy_sent_message() {
let sent_folder = config.get_sent_folder_alias()?; printer.print_log("Adding email to the Sent folder…")?;
printer.print_log(format!("Adding email to the {} folder…", sent_folder))?;
backend backend
.add_raw_message_with_flag(&sent_folder, &email, Flag::Seen) .add_raw_message_with_flag(SENT, &email, Flag::Seen)
.await?; .await?;
} }
@ -120,7 +120,7 @@ pub async fn edit_tpl_with_editor<P: Printer>(
backend backend
.add_raw_message_with_flags( .add_raw_message_with_flags(
"drafts", DRAFTS,
&email, &email,
&Flags::from_iter([Flag::Seen, Flag::Draft]), &Flags::from_iter([Flag::Seen, Flag::Draft]),
) )