From 563f9a65383e3fc74bde0b13be6468bb823442b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20DOUIN?= Date: Fri, 19 Mar 2021 23:13:06 +0100 Subject: [PATCH] split flags cli logic to a dedicated mod --- src/app.rs | 84 ++++++++++--------------------------------------- src/flag/cli.rs | 81 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 3 ++ 3 files changed, 101 insertions(+), 67 deletions(-) create mode 100644 src/flag/cli.rs diff --git a/src/app.rs b/src/app.rs index 4bb94e7..5628f0e 100644 --- a/src/app.rs +++ b/src/app.rs @@ -4,6 +4,7 @@ use std::{env, fs}; use crate::{ config::{self, Config}, + flag::cli::{flags_matches, flags_subcommand}, imap::{self, ImapConnector}, input, msg::{self, Attachments, Msg, ReadableMsg}, @@ -66,14 +67,6 @@ impl<'a> App<'a> { .default_value("0") } - fn flags_arg() -> Arg<'a, 'a> { - Arg::with_name("flags") - .help("IMAP flags (see https://tools.ietf.org/html/rfc3501#page-11)") - .value_name("FLAGS") - .multiple(true) - .required(true) - } - pub fn new() -> Self { Self(clap::App::new(env!("CARGO_PKG_NAME")) .version(env!("CARGO_PKG_VERSION")) @@ -108,31 +101,7 @@ impl<'a> App<'a> { .aliases(&["mailbox", "mboxes", "mbox", "mb", "m"]) .about("Lists all available mailboxes"), ) - .subcommand( - SubCommand::with_name("flags") - .aliases(&["flag", "f"]) - .subcommand( - SubCommand::with_name("set") - .aliases(&["s"]) - .about("Replaces all message flags") - .arg(Self::uid_arg()) - .arg(Self::flags_arg()), - ) - .subcommand( - SubCommand::with_name("add") - .aliases(&["a"]) - .about("Appends flags to a message") - .arg(Self::uid_arg()) - .arg(Self::flags_arg()), - ) - .subcommand( - SubCommand::with_name("remove") - .aliases(&["rm", "r"]) - .about("Removes flags from a message") - .arg(Self::uid_arg()) - .arg(Self::flags_arg()), - ) - ) + .subcommand(flags_subcommand()) .subcommand( SubCommand::with_name("list") .aliases(&["lst", "l"]) @@ -243,12 +212,12 @@ impl<'a> App<'a> { let matches = self.0.get_matches(); let output_type = matches.value_of("output").unwrap().to_owned(); - let account_name = matches.value_of("account"); + let account = matches.value_of("account"); let mbox = matches.value_of("mailbox").unwrap(); if let Some(_) = matches.subcommand_matches("mailboxes") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mboxes = imap_conn.list_mboxes()?; @@ -258,32 +227,13 @@ impl<'a> App<'a> { } if let Some(matches) = matches.subcommand_matches("flags") { - let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; - let mut imap_conn = ImapConnector::new(&account)?; - - if let Some(matches) = matches.subcommand_matches("set") { - let uid = matches.value_of("uid").unwrap(); - let flags = matches.value_of("flags").unwrap(); - imap_conn.set_flags(mbox, uid, flags)?; - } - - if let Some(matches) = matches.subcommand_matches("add") { - let uid = matches.value_of("uid").unwrap(); - let flags = matches.value_of("flags").unwrap(); - imap_conn.add_flags(mbox, uid, flags)?; - } - - if let Some(matches) = matches.subcommand_matches("remove") { - let uid = matches.value_of("uid").unwrap(); - let flags = matches.value_of("flags").unwrap(); - imap_conn.remove_flags(mbox, uid, flags)?; - } + flags_matches(account, &mbox, &matches) + .chain_err(|| "Could not handle flags arg matches")?; } if let Some(matches) = matches.subcommand_matches("list") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mbox = matches.value_of("mailbox").unwrap(); @@ -298,7 +248,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("search") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mbox = matches.value_of("mailbox").unwrap(); let page_size: usize = matches.value_of("size").unwrap().parse().unwrap(); @@ -336,7 +286,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("read") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mbox = matches.value_of("mailbox").unwrap(); @@ -352,7 +302,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("attachments") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mbox = matches.value_of("mailbox").unwrap(); @@ -393,7 +343,7 @@ impl<'a> App<'a> { if let Some(_) = matches.subcommand_matches("write") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let tpl = Msg::build_new_tpl(&config, &account)?; let content = input::open_editor_with_tpl(tpl.to_string().as_bytes())?; @@ -431,7 +381,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("template") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; if let Some(_) = matches.subcommand_matches("new") { @@ -466,7 +416,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("reply") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mbox = matches.value_of("mailbox").unwrap(); @@ -514,7 +464,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("forward") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mbox = matches.value_of("mailbox").unwrap(); @@ -556,7 +506,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("send") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let msg = matches.value_of("message").unwrap(); @@ -570,7 +520,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("save") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mbox = matches.value_of("mailbox").unwrap(); @@ -583,7 +533,7 @@ impl<'a> App<'a> { if let Some(matches) = matches.subcommand_matches("idle") { let config = Config::new_from_file()?; - let account = config.find_account_by_name(account_name)?; + let account = config.find_account_by_name(account)?; let mut imap_conn = ImapConnector::new(&account)?; let mbox = matches.value_of("mailbox").unwrap(); imap_conn.idle(&config, &mbox)?; diff --git a/src/flag/cli.rs b/src/flag/cli.rs new file mode 100644 index 0000000..bc02cee --- /dev/null +++ b/src/flag/cli.rs @@ -0,0 +1,81 @@ +use clap::{App, Arg, ArgMatches, SubCommand}; +use error_chain::error_chain; + +use crate::{ + config::{self, Config}, + imap::{self, ImapConnector}, +}; + +error_chain! { + links { + Config(config::Error, config::ErrorKind); + Imap(imap::Error, imap::ErrorKind); + } +} + +fn uid_arg<'a, 'b>() -> Arg<'a, 'b> { + Arg::with_name("uid") + .help("Message UID") + .value_name("UID") + .required(true) +} + +fn flags_arg<'a, 'b>() -> Arg<'a, 'b> { + Arg::with_name("flags") + .help("IMAP flags (see https://tools.ietf.org/html/rfc3501#page-11)") + .value_name("FLAGS") + .multiple(true) + .required(true) +} + +pub fn flags_subcommand<'a, 'b>() -> App<'a, 'b> { + SubCommand::with_name("flags") + .aliases(&["flag", "f"]) + .subcommand( + SubCommand::with_name("set") + .aliases(&["s"]) + .about("Replaces all message flags") + .arg(uid_arg()) + .arg(flags_arg()), + ) + .subcommand( + SubCommand::with_name("add") + .aliases(&["a"]) + .about("Appends flags to a message") + .arg(uid_arg()) + .arg(flags_arg()), + ) + .subcommand( + SubCommand::with_name("remove") + .aliases(&["rm", "r"]) + .about("Removes flags from a message") + .arg(uid_arg()) + .arg(flags_arg()), + ) +} + +pub fn flags_matches(account: Option<&str>, mbox: &str, matches: &ArgMatches) -> Result<()> { + let config = Config::new_from_file()?; + let account = config.find_account_by_name(account)?; + let mut imap_conn = ImapConnector::new(&account)?; + + if let Some(matches) = matches.subcommand_matches("set") { + let uid = matches.value_of("uid").unwrap(); + let flags = matches.value_of("flags").unwrap(); + imap_conn.set_flags(mbox, uid, flags)?; + } + + if let Some(matches) = matches.subcommand_matches("add") { + let uid = matches.value_of("uid").unwrap(); + let flags = matches.value_of("flags").unwrap(); + imap_conn.add_flags(mbox, uid, flags)?; + } + + if let Some(matches) = matches.subcommand_matches("remove") { + let uid = matches.value_of("uid").unwrap(); + let flags = matches.value_of("flags").unwrap(); + imap_conn.remove_flags(mbox, uid, flags)?; + } + + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index f704053..df7ea94 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,9 @@ mod msg; mod output; mod smtp; mod table; +mod flag { + pub(crate) mod cli; +} use crate::app::App;