improve msg arg/handlers + tpl + flag

This commit is contained in:
Clément DOUIN
2021-09-16 19:28:08 +02:00
parent bc5f9045ce
commit 54493540b4
17 changed files with 1201 additions and 1031 deletions
+77 -19
View File
@@ -2,6 +2,7 @@ use anyhow::Result;
use clap;
use env_logger;
use std::{convert::TryFrom, env};
use url::Url;
use himalaya::{
compl,
@@ -14,7 +15,6 @@ use himalaya::{
msg,
smtp::service::SmtpService,
},
flag,
output::{cli::output_args, service::OutputService},
};
@@ -26,11 +26,10 @@ fn create_app<'a>() -> clap::App<'a, 'a> {
.args(&output_args())
.args(&config_args())
.arg(mbox::arg::source_arg())
.subcommands(flag::arg::subcmds())
.subcommands(compl::arg::subcmds())
.subcommands(imap::arg::subcmds())
.subcommands(mbox::arg::subcmds())
.subcommands(msg::arg::subcmds())
.subcommands(compl::arg::subcmds())
}
fn main() -> Result<()> {
@@ -39,19 +38,18 @@ fn main() -> Result<()> {
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "off"),
);
// TODO: put in a `mailto` module
// let raw_args: Vec<String> = env::args().collect();
// if raw_args.len() > 1 && raw_args[1].starts_with("mailto:") {
// let config = Config::new(None)?;
// let account = config.find_account_by_name(None)?.clone();
// let output = Output::new("plain");
// let mbox = "INBOX";
// let arg_matches = ArgMatches::default();
// let app = Ctx::new(config, output, mbox, arg_matches);
// let url = Url::parse(&raw_args[1])?;
// let smtp = domain::smtp::service::SMTPService::new(&app.account);
// return Ok(msg_matches_mailto(&app, &url, smtp)?);
// }
// Check mailto match BEFORE app initialization.
let raw_args: Vec<String> = env::args().collect();
if raw_args.len() > 1 && raw_args[1].starts_with("mailto:") {
let mbox = Mbox::from("INBOX");
let config = Config::try_from(None)?;
let account = Account::try_from((&config, None))?;
let output = OutputService::from("plain");
let url = Url::parse(&raw_args[1])?;
let mut imap = ImapService::from((&account, &mbox));
let mut smtp = SmtpService::from(&account);
return msg::handler::mailto(&url, &account, &output, &mut imap, &mut smtp);
}
let app = create_app();
let m = app.get_matches();
@@ -91,9 +89,69 @@ fn main() -> Result<()> {
_ => (),
}
// TODO: use same system as compl
let _matched = flag::arg::matches(&m, &mut imap)?
|| msg::arg::matches(&m, &mbox, &account, &output, &mut imap, &mut smtp)?;
// Check message matches.
match msg::arg::matches(&m)? {
Some(msg::arg::Match::Attachments(uid)) => {
return msg::handler::attachments(uid, &account, &output, &mut imap);
}
Some(msg::arg::Match::Copy(uid, mbox)) => {
return msg::handler::copy(uid, mbox, &output, &mut imap);
}
Some(msg::arg::Match::Delete(uid)) => {
return msg::handler::delete(uid, &output, &mut imap);
}
Some(msg::arg::Match::Forward(uid, paths)) => {
return msg::handler::forward(uid, paths, &account, &output, &mut imap, &mut smtp);
}
Some(msg::arg::Match::List(page_size, page)) => {
return msg::handler::list(page_size, page, &account, &output, &mut imap);
}
Some(msg::arg::Match::Move(uid, mbox)) => {
return msg::handler::move_(uid, mbox, &output, &mut imap);
}
Some(msg::arg::Match::Read(uid, mime, raw)) => {
return msg::handler::read(uid, mime, raw, &output, &mut imap);
}
Some(msg::arg::Match::Reply(uid, all, paths)) => {
return msg::handler::reply(uid, all, paths, &account, &output, &mut imap, &mut smtp);
}
Some(msg::arg::Match::Save(mbox, msg)) => {
return msg::handler::save(mbox, msg, &mut imap);
}
Some(msg::arg::Match::Search(query, page_size, page)) => {
return msg::handler::search(page_size, page, query, &account, &output, &mut imap);
}
Some(msg::arg::Match::Send(msg)) => {
return msg::handler::send(msg, &output, &mut imap, &mut smtp);
}
Some(msg::arg::Match::Write(paths)) => {
return msg::handler::write(paths, &account, &output, &mut imap, &mut smtp);
}
Some(msg::arg::Match::Flag(m)) => match m {
msg::flag::arg::Match::Set(uid, flags) => {
return msg::flag::handler::set(uid, flags, &mut imap);
}
msg::flag::arg::Match::Add(uid, flags) => {
return msg::flag::handler::add(uid, flags, &mut imap);
}
msg::flag::arg::Match::Remove(uid, flags) => {
return msg::flag::handler::remove(uid, flags, &mut imap);
}
},
Some(msg::arg::Match::Tpl(m)) => match m {
msg::tpl::arg::Match::New => {
return msg::tpl::handler::new(&account, &output, &mut imap);
}
msg::tpl::arg::Match::Reply(uid, all) => {
return msg::tpl::handler::reply(uid, all, &account, &output, &mut imap);
}
msg::tpl::arg::Match::Forward(uid) => {
return msg::tpl::handler::forward(uid, &account, &output, &mut imap);
}
},
_ => (),
}
Ok(())
}