command/parser: unify toggle_* parsers

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
pull/299/head
Manos Pitsidianakis 2023-09-07 15:47:54 +03:00
parent 63abf1e890
commit bb4d200036
Signed by: Manos Pitsidianakis
GPG Key ID: 7729C7707F7E09D0
3 changed files with 58 additions and 65 deletions

View File

@ -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 <TERM>, 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",

View File

@ -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) => {{

View File

@ -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<Action, CommandErro
import,
search,
select,
toggle_thread_snooze,
open_in_new_tab,
export_mbox,
_tag,
@ -100,14 +105,7 @@ pub fn listing_action(input: &[u8]) -> IResult<&[u8], Result<Action, CommandErro
}
pub fn compose_action(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
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<Action, CommandError>> {
@ -148,7 +146,7 @@ pub fn parse_command(input: &[u8]) -> Result<Action, CommandError> {
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<Action, CommandError>>
let (input, _) = eof(input)?;
Ok((input, Ok(SortColumn(i, order))))
}
pub fn toggle_thread_snooze(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
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<Action, CommandError>> {
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<Action, CommandError>>
let (input, _) = eof(input)?;
Ok((input, Ok(Compose(SaveDraft))))
}
pub fn toggle_sign(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
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<Action, CommandError>> {
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<Action, CommandError>> {
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<Action, CommandError
let (input, _) = eof(input)?;
Ok((input, Ok(PrintSetting(setting.to_string()))))
}
pub fn toggle_mouse(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
let mut check = arg_init! { min_arg:1, max_arg: 1, toggle_mouse};
pub fn toggle(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
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<Action, CommandError>> {
let mut check = arg_init! { min_arg:0, max_arg: 0, manage_mailboxes};