From bb4d20003690d72b62a66d46a1fc5ae914e2bf64 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Thu, 7 Sep 2023 15:47:54 +0300 Subject: [PATCH] command/parser: unify toggle_* parsers Signed-off-by: Manos Pitsidianakis --- meli/src/command.rs | 8 ++-- meli/src/command/argcheck.rs | 26 +++++------ meli/src/command/parser.rs | 89 +++++++++++++++++------------------- 3 files changed, 58 insertions(+), 65 deletions(-) diff --git a/meli/src/command.rs b/meli/src/command.rs index 1ce612dd..8e100146 100644 --- a/meli/src/command.rs +++ b/meli/src/command.rs @@ -332,7 +332,7 @@ define_commands!([ { tags: ["toggle thread_snooze"], desc: "turn off new notifications for this thread", tokens: &[One(Literal("toggle")), One(Literal("thread_snooze"))], - parser: parser::toggle_thread_snooze + parser: parser::toggle }, { tags: ["search"], desc: "search , searches list with given term", @@ -400,12 +400,12 @@ Alternatives(&[to_stream!(One(Literal("add-attachment")), One(Filepath)), to_str { tags: ["toggle sign "], desc: "switch between sign/unsign for this draft", tokens: &[One(Literal("toggle")), One(Literal("sign"))], - parser: parser::toggle_sign + parser: parser::toggle }, { tags: ["toggle encrypt"], desc: "toggle encryption for this draft", tokens: &[One(Literal("toggle")), One(Literal("encrypt"))], - parser: parser::toggle_encrypt + parser: parser::toggle }, { tags: ["create-mailbox "], desc: "create-mailbox ACCOUNT MAILBOX_PATH", @@ -475,7 +475,7 @@ Alternatives(&[to_stream!(One(Literal("add-attachment")), One(Filepath)), to_str { tags: ["toggle mouse"], desc: "toggle mouse support", tokens: &[One(Literal("toggle")), One(Literal("mouse"))], - parser: parser::toggle_mouse + parser: parser::toggle }, { tags: ["manage-mailboxes"], desc: "view and manage mailbox preferences", diff --git a/meli/src/command/argcheck.rs b/meli/src/command/argcheck.rs index 529178bc..a935818f 100644 --- a/meli/src/command/argcheck.rs +++ b/meli/src/command/argcheck.rs @@ -147,19 +147,19 @@ macro_rules! arg_init { }}; } -macro_rules! arg_value_check { - ($tag:literal, $input:expr) => {{ - if tag::<&'_ str, &'_ [u8], melib::nom::error::Error<&[u8]>>($tag)($input).is_err() { - return Ok(( - $input, - Err(CommandError::BadValue { - inner: $tag.to_string().into(), - }), - )); - } - tag($tag)($input) - }}; -} +//macro_rules! arg_value_check { +// ($tag:literal, $input:expr) => {{ +// if tag::<&'_ str, &'_ [u8], +// melib::nom::error::Error<&[u8]>>($tag)($input).is_err() { return +// Ok(( $input, +// Err(CommandError::BadValue { +// inner: $tag.to_string().into(), +// }), +// )); +// } +// tag($tag)($input) +// }}; +//} macro_rules! arg_chk { (start $check:ident, $input:expr) => {{ diff --git a/meli/src/command/parser.rs b/meli/src/command/parser.rs index 330f8249..7d413572 100644 --- a/meli/src/command/parser.rs +++ b/meli/src/command/parser.rs @@ -47,6 +47,12 @@ macro_rules! command_err { }}; } +macro_rules! tag { + () => {{ + tag::<&'_ str, &'_ [u8], melib::nom::error::Error<&[u8]>> + }}; +} + pub fn usize_c(input: &[u8]) -> IResult<&[u8], usize> { map_res( map_res(digit1, std::str::from_utf8), @@ -92,7 +98,6 @@ pub fn listing_action(input: &[u8]) -> IResult<&[u8], Result IResult<&[u8], Result IResult<&[u8], Result> { - alt(( - add_attachment, - mailto, - remove_attachment, - toggle_sign, - toggle_encrypt, - save_draft, - ))(input) + alt((add_attachment, mailto, remove_attachment, save_draft))(input) } pub fn account_action(input: &[u8]) -> IResult<&[u8], Result> { @@ -148,7 +146,7 @@ pub fn parse_command(input: &[u8]) -> Result { new_tab, account_action, print_setting, - toggle_mouse, + toggle, reload_config, quit, ))(input) @@ -326,17 +324,6 @@ pub fn sort_column(input: &[u8]) -> IResult<&[u8], Result> let (input, _) = eof(input)?; Ok((input, Ok(SortColumn(i, order)))) } -pub fn toggle_thread_snooze(input: &[u8]) -> IResult<&[u8], Result> { - let mut check = arg_init! { min_arg:0, max_arg: 0, toggle_thread_snooze}; - let (input, _) = tag("toggle")(input.trim())?; - arg_chk!(start check, input); - let (input, _) = is_a(" ")(input)?; - arg_chk!(inc check, input); - let (input, _) = tag("thread_snooze")(input.trim())?; - arg_chk!(finish check, input); - let (input, _) = eof(input)?; - Ok((input, Ok(Listing(ToggleThreadSnooze)))) -} pub fn search(input: &[u8]) -> IResult<&[u8], Result> { let mut check = arg_init! { min_arg:1, max_arg:{ u8::MAX}, search}; let (input, _) = tag("search")(input.trim())?; @@ -547,28 +534,6 @@ pub fn save_draft(input: &[u8]) -> IResult<&[u8], Result> let (input, _) = eof(input)?; Ok((input, Ok(Compose(SaveDraft)))) } -pub fn toggle_sign(input: &[u8]) -> IResult<&[u8], Result> { - let mut check = arg_init! { min_arg:1, max_arg: 1, toggle_sign}; - let (input, _) = tag("toggle")(input.trim())?; - arg_chk!(start check, input); - let (input, _) = is_a(" ")(input)?; - arg_chk!(inc check, input); - let (input, _) = arg_value_check!("sign", input)?; - arg_chk!(finish check, input); - let (input, _) = eof(input)?; - Ok((input, Ok(Compose(ToggleSign)))) -} -pub fn toggle_encrypt(input: &[u8]) -> IResult<&[u8], Result> { - let mut check = arg_init! { min_arg:1, max_arg: 1, toggle_encrypt}; - let (input, _) = tag("toggle")(input.trim())?; - arg_chk!(start check, input); - let (input, _) = is_a(" ")(input)?; - arg_chk!(inc check, input); - let (input, _) = arg_value_check!("encrypt", input)?; - arg_chk!(finish check, input); - let (input, _) = eof(input)?; - Ok((input, Ok(Compose(ToggleEncrypt)))) -} pub fn create_mailbox(input: &[u8]) -> IResult<&[u8], Result> { let mut check = arg_init! { min_arg:1, max_arg: 1, create_malbox}; let (input, _) = tag("create-mailbox")(input.trim())?; @@ -784,16 +749,44 @@ pub fn print_setting(input: &[u8]) -> IResult<&[u8], Result IResult<&[u8], Result> { - let mut check = arg_init! { min_arg:1, max_arg: 1, toggle_mouse}; +pub fn toggle(input: &[u8]) -> IResult<&[u8], Result> { + let mut check = arg_init! { min_arg:1, max_arg: 1, toggle }; let (input, _) = tag("toggle")(input.trim())?; arg_chk!(start check, input); - let (input, _) = is_a(" ")(input)?; + let (mut input, _) = is_a(" ")(input)?; arg_chk!(inc check, input); - let (input, _) = tag("mouse")(input.trim())?; + let mut retval = if tag!()("thread_snooze")(input.ltrim()).is_ok() { + Some(Listing(ToggleThreadSnooze)) + } else { + None + }; + for (tok, action) in [ + ("thread_snooze", Listing(ToggleThreadSnooze)), + ("mouse", ToggleMouse), + ("sign", Compose(ToggleSign)), + ("encrypt", Compose(ToggleEncrypt)), + ] { + if let Ok((inner_input, _)) = tag!()(tok)(input.trim()) { + input = inner_input; + retval = Some(action); + break; + } + } + let retval = match retval { + None => { + return Ok(( + input, + Err(CommandError::BadValue { + inner: "Valid toggle values are thread_snooze, mouse, sign, encrypt.".into(), + }), + )); + } + Some(v) => v, + }; + arg_chk!(finish check, input); let (input, _) = eof(input)?; - Ok((input, Ok(ToggleMouse))) + Ok((input, Ok(retval))) } pub fn manage_mailboxes(input: &[u8]) -> IResult<&[u8], Result> { let mut check = arg_init! { min_arg:0, max_arg: 0, manage_mailboxes};