diff --git a/src/compl/arg.rs b/src/compl/arg.rs index 984b374..adbbde1 100644 --- a/src/compl/arg.rs +++ b/src/compl/arg.rs @@ -1,24 +1,26 @@ -//! Module related to completion arguments. +//! Module related to completion CLI. //! -//! This module provides subcommands and an argument matcher related to completion. +//! This module provides subcommands and a command matcher related to completion. use anyhow::Result; use clap::{self, App, Arg, ArgMatches, Shell, SubCommand}; use log::debug; -/// Enumeration of all possible matches. -pub enum Match<'a> { +type OptionShell<'a> = Option<&'a str>; + +/// Completion commands. +pub enum Command<'a> { /// Generate completion script for the given shell slice. - Generate(&'a str), + Generate(OptionShell<'a>), } -/// Completion arg matcher. -pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { +/// Completion command matcher. +pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { if let Some(m) = m.subcommand_matches("completion") { debug!("completion command matched"); - let shell = m.value_of("shell").unwrap(); - debug!("shell: {}", shell); - return Ok(Some(Match::Generate(shell))); + let shell = m.value_of("shell"); + debug!("shell: `{:?}`", shell); + return Ok(Some(Command::Generate(shell))); }; Ok(None) diff --git a/src/compl/handler.rs b/src/compl/handler.rs index 5fb0efc..5c4ca01 100644 --- a/src/compl/handler.rs +++ b/src/compl/handler.rs @@ -7,8 +7,8 @@ use clap::{App, Shell}; use std::{io, str::FromStr}; /// Generate completion script from the given [`clap::App`] for the given shell slice. -pub fn generate<'a>(shell: &'a str, mut app: App<'a, 'a>) -> Result<()> { - let shell = Shell::from_str(shell) +pub fn generate<'a>(shell: Option<&'a str>, mut app: App<'a, 'a>) -> Result<()> { + let shell = Shell::from_str(shell.unwrap_or_default()) .map_err(|err| anyhow!(err)) .context("cannot parse shell")?; app.gen_completions_to("himalaya", shell, &mut io::stdout()); diff --git a/src/config/arg.rs b/src/config/arg.rs index 538ecd0..b0f34d8 100644 --- a/src/config/arg.rs +++ b/src/config/arg.rs @@ -1,3 +1,7 @@ +//! Module related to config CLI. +//! +//! This module provides arguments related to config. + use clap::Arg; /// Config arguments. diff --git a/src/domain/imap/arg.rs b/src/domain/imap/arg.rs index 3c47c32..257f1d4 100644 --- a/src/domain/imap/arg.rs +++ b/src/domain/imap/arg.rs @@ -1,34 +1,36 @@ -//! Module related to IMAP arguments. +//! Module related to IMAP CLI. //! -//! This module provides subcommands and an argument matcher related to IMAP. +//! This module provides subcommands and a command matcher related to IMAP. use anyhow::Result; use clap::{App, ArgMatches}; use log::debug; -/// Enumeration of all possible matches. -pub enum Match { +type Keepalive = u64; + +/// IMAP commands. +pub enum Command { /// Start the IMAP notify mode with the give keepalive duration. - Notify(u64), + Notify(Keepalive), /// Start the IMAP watch mode with the give keepalive duration. - Watch(u64), + Watch(Keepalive), } -/// IMAP arg matcher. -pub fn matches(m: &ArgMatches) -> Result> { +/// IMAP command matcher. +pub fn matches(m: &ArgMatches) -> Result> { if let Some(m) = m.subcommand_matches("notify") { debug!("notify command matched"); let keepalive = clap::value_t_or_exit!(m.value_of("keepalive"), u64); debug!("keepalive: {}", keepalive); - return Ok(Some(Match::Notify(keepalive))); + return Ok(Some(Command::Notify(keepalive))); } if let Some(m) = m.subcommand_matches("watch") { debug!("watch command matched"); let keepalive = clap::value_t_or_exit!(m.value_of("keepalive"), u64); debug!("keepalive: {}", keepalive); - return Ok(Some(Match::Watch(keepalive))); + return Ok(Some(Command::Watch(keepalive))); } Ok(None) diff --git a/src/domain/mbox/arg.rs b/src/domain/mbox/arg.rs index d615f49..05d27d6 100644 --- a/src/domain/mbox/arg.rs +++ b/src/domain/mbox/arg.rs @@ -1,35 +1,35 @@ -//! Module related to mailboxes arguments. +//! Module related to mailbox CLI. //! -//! This module provides subcommands and an argument matcher related to mailboxes. +//! This module provides subcommands, arguments and a command matcher related to mailbox. use anyhow::Result; use clap::{App, Arg, ArgMatches, SubCommand}; use log::debug; -/// Enumeration of all possible matches. -pub enum Match { +/// Mailbox commands. +pub enum Commands { /// List all available mailboxes. List, } -/// Mailboxes arg matcher. -pub fn matches(m: &ArgMatches) -> Result> { +/// Mailbox command matcher. +pub fn matches(m: &ArgMatches) -> Result> { if let Some(_) = m.subcommand_matches("mailboxes") { debug!("mailboxes command matched"); - return Ok(Some(Match::List)); + return Ok(Some(Commands::List)); } Ok(None) } -/// Mailboxes subcommands. +/// Mailbox subcommands. pub fn subcmds<'a>() -> Vec> { vec![SubCommand::with_name("mailboxes") .aliases(&["mailbox", "mboxes", "mbox", "m"]) .about("Lists all mailboxes")] } -/// Source mailbox arg. +/// Source mailbox argument. pub fn source_arg<'a>() -> Arg<'a, 'a> { Arg::with_name("mailbox") .short("m") @@ -39,7 +39,7 @@ pub fn source_arg<'a>() -> Arg<'a, 'a> { .default_value("INBOX") } -/// Target mailbox arg. +/// Target mailbox argument. pub fn target_arg<'a>() -> Arg<'a, 'a> { Arg::with_name("target") .help("Specifies the targetted mailbox") diff --git a/src/domain/msg/arg.rs b/src/domain/msg/arg.rs index f06fee2..7c0f170 100644 --- a/src/domain/msg/arg.rs +++ b/src/domain/msg/arg.rs @@ -1,3 +1,7 @@ +//! Module related to message CLI. +//! +//! This module provides subcommands, arguments and a command matcher related to message. + use anyhow::Result; use clap::{self, App, Arg, ArgMatches, SubCommand}; use log::debug; @@ -15,8 +19,8 @@ type RawMsg<'a> = &'a str; type Query = String; type AttachmentsPaths<'a> = Vec<&'a str>; -/// Enumeration of all possible matches. -pub enum Match<'a> { +/// Message commands. +pub enum Command<'a> { Attachments(Uid<'a>), Copy(Uid<'a>, TargetMbox<'a>), Delete(Uid<'a>), @@ -30,16 +34,17 @@ pub enum Match<'a> { Send(RawMsg<'a>), Write(AttachmentsPaths<'a>), - Flag(msg::flag::arg::Match<'a>), - Tpl(msg::tpl::arg::Match<'a>), + Flag(msg::flag::arg::Command<'a>), + Tpl(msg::tpl::arg::Command<'a>), } -pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { +/// Message command matcher. +pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { if let Some(m) = m.subcommand_matches("attachments") { debug!("attachments command matched"); let uid = m.value_of("uid").unwrap(); debug!("uid: {}", &uid); - return Ok(Some(Match::Attachments(uid))); + return Ok(Some(Command::Attachments(uid))); } if let Some(m) = m.subcommand_matches("copy") { @@ -48,18 +53,18 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { debug!("uid: {}", &uid); let target = m.value_of("target"); debug!("target mailbox: `{:?}`", target); - return Ok(Some(Match::Copy(uid, target))); + return Ok(Some(Command::Copy(uid, target))); } if let Some(m) = m.subcommand_matches("delete") { debug!("copy command matched"); let uid = m.value_of("uid").unwrap(); debug!("uid: {}", &uid); - return Ok(Some(Match::Delete(uid))); + return Ok(Some(Command::Delete(uid))); } if let Some(m) = msg::flag::arg::matches(&m)? { - return Ok(Some(Match::Flag(m))); + return Ok(Some(Command::Flag(m))); } if let Some(m) = m.subcommand_matches("forward") { @@ -68,7 +73,7 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { let paths: Vec<&str> = m.values_of("attachments").unwrap_or_default().collect(); debug!("attachments paths: {:?}", paths); debug!("uid: {}", &uid); - return Ok(Some(Match::Forward(uid, paths))); + return Ok(Some(Command::Forward(uid, paths))); } if let Some(m) = m.subcommand_matches("list") { @@ -83,7 +88,7 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { .map(|page| 1.max(page) - 1) .unwrap_or_default(); debug!("page: `{:?}`", page); - return Ok(Some(Match::List(page_size, page))); + return Ok(Some(Command::List(page_size, page))); } if let Some(m) = m.subcommand_matches("move") { @@ -92,7 +97,7 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { debug!("uid: {}", &uid); let target = m.value_of("target"); debug!("target mailbox: `{:?}`", target); - return Ok(Some(Match::Move(uid, target))); + return Ok(Some(Command::Move(uid, target))); } if let Some(m) = m.subcommand_matches("read") { @@ -102,7 +107,7 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { debug!("mime: {}", mime); let raw = m.is_present("raw"); debug!("raw: {}", raw); - return Ok(Some(Match::Read(uid, mime, raw))); + return Ok(Some(Command::Read(uid, mime, raw))); } if let Some(m) = m.subcommand_matches("reply") { @@ -113,7 +118,7 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { debug!("reply all: {}", all); let paths: Vec<&str> = m.values_of("attachments").unwrap_or_default().collect(); debug!("attachments paths: {:?}", paths); - return Ok(Some(Match::Reply(uid, all, paths))); + return Ok(Some(Command::Reply(uid, all, paths))); } if let Some(m) = m.subcommand_matches("save") { @@ -122,7 +127,7 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { debug!("message: {}", &msg); let target = m.value_of("target"); debug!("target mailbox: `{:?}`", target); - return Ok(Some(Match::Save(target, msg))); + return Ok(Some(Command::Save(target, msg))); } if let Some(m) = m.subcommand_matches("search") { @@ -161,34 +166,32 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { }) .1 .join(" "); - return Ok(Some(Match::Search(query, page_size, page))); + return Ok(Some(Command::Search(query, page_size, page))); } if let Some(m) = m.subcommand_matches("send") { debug!("send command matched"); let msg = m.value_of("message").unwrap_or_default(); debug!("message: {}", msg); - return Ok(Some(Match::Send(msg))); + return Ok(Some(Command::Send(msg))); } if let Some(m) = msg::tpl::arg::matches(&m)? { - return Ok(Some(Match::Tpl(m))); + return Ok(Some(Command::Tpl(m))); } if let Some(m) = m.subcommand_matches("write") { debug!("write command matched"); let attachment_paths: Vec<&str> = m.values_of("attachments").unwrap_or_default().collect(); debug!("attachments paths: {:?}", attachment_paths); - return Ok(Some(Match::Write(attachment_paths))); + return Ok(Some(Command::Write(attachment_paths))); } debug!("default list command matched"); - Ok(Some(Match::List(None, 0))) + Ok(Some(Command::List(None, 0))) } -// == Argument Functions == -/// Returns an Clap-Argument to be able to use `` in the commandline like -/// for the `himalaya read` subcommand. +/// Message UID argument. pub(crate) fn uid_arg<'a>() -> Arg<'a, 'a> { Arg::with_name("uid") .help("Specifies the targetted message") @@ -196,6 +199,7 @@ pub(crate) fn uid_arg<'a>() -> Arg<'a, 'a> { .required(true) } +/// Message reply all argument. pub(crate) fn reply_all_arg<'a>() -> Arg<'a, 'a> { Arg::with_name("reply-all") .help("Includes all recipients") @@ -203,6 +207,7 @@ pub(crate) fn reply_all_arg<'a>() -> Arg<'a, 'a> { .long("all") } +/// Message page size argument. fn page_size_arg<'a>() -> Arg<'a, 'a> { Arg::with_name("page-size") .help("Page size") @@ -211,6 +216,7 @@ fn page_size_arg<'a>() -> Arg<'a, 'a> { .value_name("INT") } +/// Message page argument. fn page_arg<'a>() -> Arg<'a, 'a> { Arg::with_name("page") .help("Page number") @@ -220,6 +226,7 @@ fn page_arg<'a>() -> Arg<'a, 'a> { .default_value("0") } +/// Message attachment argument. /// TODO: move to attachment folder fn attachment_arg<'a>() -> Arg<'a, 'a> { Arg::with_name("attachments") @@ -230,7 +237,7 @@ fn attachment_arg<'a>() -> Arg<'a, 'a> { .multiple(true) } -/// Messages subcommands. +/// Message subcommands. pub fn subcmds<'a>() -> Vec> { vec![ msg::flag::arg::subcmds(), diff --git a/src/domain/msg/flag/arg.rs b/src/domain/msg/flag/arg.rs index 4f9fc56..d21b29f 100644 --- a/src/domain/msg/flag/arg.rs +++ b/src/domain/msg/flag/arg.rs @@ -1,3 +1,7 @@ +//! Module related to message flag CLI. +//! +//! This module provides subcommands, arguments and a command matcher related to message flag. + use anyhow::Result; use clap::{self, App, Arg, ArgMatches, SubCommand}; use log::debug; @@ -7,22 +11,22 @@ use crate::domain::msg; type Uid<'a> = &'a str; type Flags<'a> = &'a str; -/// Enumeration of all possible matches. -pub enum Match<'a> { +/// Message flag commands. +pub enum Command<'a> { Set(Uid<'a>, Flags<'a>), Add(Uid<'a>, Flags<'a>), Remove(Uid<'a>, Flags<'a>), } -/// Message flag arg matcher. -pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { +/// Message flag command matcher. +pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { if let Some(m) = m.subcommand_matches("set") { debug!("set command matched"); let uid = m.value_of("uid").unwrap(); debug!("uid: {}", uid); let flags = m.value_of("flags").unwrap(); debug!("flags: {}", flags); - return Ok(Some(Match::Set(uid, flags))); + return Ok(Some(Command::Set(uid, flags))); } if let Some(m) = m.subcommand_matches("add") { @@ -31,7 +35,7 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { debug!("uid: {}", uid); let flags = m.value_of("flags").unwrap(); debug!("flags: {}", flags); - return Ok(Some(Match::Add(uid, flags))); + return Ok(Some(Command::Add(uid, flags))); } if let Some(m) = m.subcommand_matches("remove") { @@ -40,13 +44,13 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { debug!("uid: {}", uid); let flags = m.value_of("flags").unwrap(); debug!("flags: {}", flags); - return Ok(Some(Match::Remove(uid, flags))); + return Ok(Some(Command::Remove(uid, flags))); } Ok(None) } -/// Message flag arg. +/// Message flag flags argument. fn flags_arg<'a>() -> Arg<'a, 'a> { Arg::with_name("flags") .help("IMAP flags (see https://tools.ietf.org/html/rfc3501#page-11). Just write the flag name without the backslash. Example: --flags \"Seen Answered\"") diff --git a/src/domain/msg/tpl/arg.rs b/src/domain/msg/tpl/arg.rs index efcc25b..bee9e38 100644 --- a/src/domain/msg/tpl/arg.rs +++ b/src/domain/msg/tpl/arg.rs @@ -1,3 +1,7 @@ +//! Module related to message template CLI. +//! +//! This module provides subcommands, arguments and a command matcher related to message template. + use anyhow::Result; use clap::{self, App, Arg, ArgMatches, SubCommand}; use log::debug; @@ -7,18 +11,18 @@ use crate::domain::msg::{self, arg::uid_arg}; type Uid<'a> = &'a str; type All = bool; -/// Enumeration of all possible matches. -pub enum Match<'a> { +/// Message template commands. +pub enum Command<'a> { New, Reply(Uid<'a>, All), Forward(Uid<'a>), } -/// Message template arg matcher. -pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { +/// Message template command matcher. +pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { if let Some(_) = m.subcommand_matches("new") { debug!("new command matched"); - return Ok(Some(Match::New)); + return Ok(Some(Command::New)); } if let Some(m) = m.subcommand_matches("reply") { @@ -27,14 +31,14 @@ pub fn matches<'a>(m: &'a ArgMatches) -> Result>> { debug!("uid: {}", uid); let all = m.is_present("reply-all"); debug!("reply all: {}", all); - return Ok(Some(Match::Reply(uid, all))); + return Ok(Some(Command::Reply(uid, all))); } if let Some(m) = m.subcommand_matches("forward") { debug!("forward command matched"); let uid = m.value_of("uid").unwrap(); debug!("uid: {}", uid); - return Ok(Some(Match::Forward(uid))); + return Ok(Some(Command::Forward(uid))); } Ok(None) diff --git a/src/main.rs b/src/main.rs index a735786..e9b964d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,7 +58,7 @@ fn main() -> Result<()> { // Check completion match BEFORE any entity or service initialization. // See https://github.com/soywod/himalaya/issues/115. match compl::arg::matches(&m)? { - Some(compl::arg::Match::Generate(shell)) => { + Some(compl::arg::Command::Generate(shell)) => { return compl::handler::generate(shell, create_app()); } _ => (), @@ -73,10 +73,10 @@ fn main() -> Result<()> { // Check IMAP matches. match imap::arg::matches(&m)? { - Some(imap::arg::Match::Notify(keepalive)) => { + Some(imap::arg::Command::Notify(keepalive)) => { return imap::handler::notify(keepalive, &config, &mut imap); } - Some(imap::arg::Match::Watch(keepalive)) => { + Some(imap::arg::Command::Watch(keepalive)) => { return imap::handler::watch(keepalive, &mut imap); } _ => (), @@ -84,7 +84,7 @@ fn main() -> Result<()> { // Check mailbox matches. match mbox::arg::matches(&m)? { - Some(mbox::arg::Match::List) => { + Some(mbox::arg::Commands::List) => { return mbox::handler::list(&output, &mut imap); } _ => (), @@ -92,62 +92,62 @@ fn main() -> Result<()> { // Check message matches. match msg::arg::matches(&m)? { - Some(msg::arg::Match::Attachments(uid)) => { + Some(msg::arg::Command::Attachments(uid)) => { return msg::handler::attachments(uid, &account, &output, &mut imap); } - Some(msg::arg::Match::Copy(uid, mbox)) => { + Some(msg::arg::Command::Copy(uid, mbox)) => { return msg::handler::copy(uid, mbox, &output, &mut imap); } - Some(msg::arg::Match::Delete(uid)) => { + Some(msg::arg::Command::Delete(uid)) => { return msg::handler::delete(uid, &output, &mut imap); } - Some(msg::arg::Match::Forward(uid, paths)) => { + Some(msg::arg::Command::Forward(uid, paths)) => { return msg::handler::forward(uid, paths, &account, &output, &mut imap, &mut smtp); } - Some(msg::arg::Match::List(page_size, page)) => { + Some(msg::arg::Command::List(page_size, page)) => { return msg::handler::list(page_size, page, &account, &output, &mut imap); } - Some(msg::arg::Match::Move(uid, mbox)) => { + Some(msg::arg::Command::Move(uid, mbox)) => { return msg::handler::move_(uid, mbox, &output, &mut imap); } - Some(msg::arg::Match::Read(uid, mime, raw)) => { + Some(msg::arg::Command::Read(uid, mime, raw)) => { return msg::handler::read(uid, mime, raw, &output, &mut imap); } - Some(msg::arg::Match::Reply(uid, all, paths)) => { + Some(msg::arg::Command::Reply(uid, all, paths)) => { return msg::handler::reply(uid, all, paths, &account, &output, &mut imap, &mut smtp); } - Some(msg::arg::Match::Save(mbox, msg)) => { + Some(msg::arg::Command::Save(mbox, msg)) => { return msg::handler::save(mbox, msg, &mut imap); } - Some(msg::arg::Match::Search(query, page_size, page)) => { + Some(msg::arg::Command::Search(query, page_size, page)) => { return msg::handler::search(page_size, page, query, &account, &output, &mut imap); } - Some(msg::arg::Match::Send(msg)) => { + Some(msg::arg::Command::Send(msg)) => { return msg::handler::send(msg, &output, &mut imap, &mut smtp); } - Some(msg::arg::Match::Write(paths)) => { + Some(msg::arg::Command::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) => { + Some(msg::arg::Command::Flag(m)) => match m { + msg::flag::arg::Command::Set(uid, flags) => { return msg::flag::handler::set(uid, flags, &mut imap); } - msg::flag::arg::Match::Add(uid, flags) => { + msg::flag::arg::Command::Add(uid, flags) => { return msg::flag::handler::add(uid, flags, &mut imap); } - msg::flag::arg::Match::Remove(uid, flags) => { + msg::flag::arg::Command::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 => { + Some(msg::arg::Command::Tpl(m)) => match m { + msg::tpl::arg::Command::New => { return msg::tpl::handler::new(&account, &output, &mut imap); } - msg::tpl::arg::Match::Reply(uid, all) => { + msg::tpl::arg::Command::Reply(uid, all) => { return msg::tpl::handler::reply(uid, all, &account, &output, &mut imap); } - msg::tpl::arg::Match::Forward(uid) => { + msg::tpl::arg::Command::Forward(uid) => { return msg::tpl::handler::forward(uid, &account, &output, &mut imap); } }, diff --git a/src/output/arg.rs b/src/output/arg.rs index b4c49ad..84417b8 100644 --- a/src/output/arg.rs +++ b/src/output/arg.rs @@ -1,3 +1,7 @@ +//! Module related to output CLI. +//! +//! This module provides arguments related to output. + use clap::Arg; /// Output arguments.