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]]
name = "email-lib"
version = "0.17.1"
source = "git+https://git.sr.ht/~soywod/pimalaya#9b69f07b6278550d74b8ba5afd2618a57c6225af"
source = "git+https://git.sr.ht/~soywod/pimalaya#da6c3e9834c5e2071a66a6b7e3e71a8eddc73766"
dependencies = [
"advisory-lock",
"anyhow",

View file

@ -11,6 +11,19 @@ pub struct AccountNameArg {
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.
#[derive(Debug, Default, Parser)]
pub struct AccountNameFlag {

View file

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

View file

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

View file

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

View file

@ -1,12 +1,12 @@
use clap::Parser;
use email::account::config::DEFAULT_INBOX_FOLDER;
use email::folder::INBOX;
/// The optional folder name flag parser.
#[derive(Debug, Parser)]
pub struct FolderNameOptionalFlag {
/// The name of the folder.
#[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,
}
@ -14,7 +14,7 @@ pub struct FolderNameOptionalFlag {
#[derive(Debug, Parser)]
pub struct FolderNameOptionalArg {
/// 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,
}

View file

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