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"], { tags: ["toggle thread_snooze"],
desc: "turn off new notifications for this thread", desc: "turn off new notifications for this thread",
tokens: &[One(Literal("toggle")), One(Literal("thread_snooze"))], tokens: &[One(Literal("toggle")), One(Literal("thread_snooze"))],
parser: parser::toggle_thread_snooze parser: parser::toggle
}, },
{ tags: ["search"], { tags: ["search"],
desc: "search <TERM>, searches list with given term", 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 "], { tags: ["toggle sign "],
desc: "switch between sign/unsign for this draft", desc: "switch between sign/unsign for this draft",
tokens: &[One(Literal("toggle")), One(Literal("sign"))], tokens: &[One(Literal("toggle")), One(Literal("sign"))],
parser: parser::toggle_sign parser: parser::toggle
}, },
{ tags: ["toggle encrypt"], { tags: ["toggle encrypt"],
desc: "toggle encryption for this draft", desc: "toggle encryption for this draft",
tokens: &[One(Literal("toggle")), One(Literal("encrypt"))], tokens: &[One(Literal("toggle")), One(Literal("encrypt"))],
parser: parser::toggle_encrypt parser: parser::toggle
}, },
{ tags: ["create-mailbox "], { tags: ["create-mailbox "],
desc: "create-mailbox ACCOUNT MAILBOX_PATH", desc: "create-mailbox ACCOUNT MAILBOX_PATH",
@ -475,7 +475,7 @@ Alternatives(&[to_stream!(One(Literal("add-attachment")), One(Filepath)), to_str
{ tags: ["toggle mouse"], { tags: ["toggle mouse"],
desc: "toggle mouse support", desc: "toggle mouse support",
tokens: &[One(Literal("toggle")), One(Literal("mouse"))], tokens: &[One(Literal("toggle")), One(Literal("mouse"))],
parser: parser::toggle_mouse parser: parser::toggle
}, },
{ tags: ["manage-mailboxes"], { tags: ["manage-mailboxes"],
desc: "view and manage mailbox preferences", desc: "view and manage mailbox preferences",

View File

@ -147,19 +147,19 @@ macro_rules! arg_init {
}}; }};
} }
macro_rules! arg_value_check { //macro_rules! arg_value_check {
($tag:literal, $input:expr) => {{ // ($tag:literal, $input:expr) => {{
if tag::<&'_ str, &'_ [u8], melib::nom::error::Error<&[u8]>>($tag)($input).is_err() { // if tag::<&'_ str, &'_ [u8],
return Ok(( // melib::nom::error::Error<&[u8]>>($tag)($input).is_err() { return
$input, // Ok(( $input,
Err(CommandError::BadValue { // Err(CommandError::BadValue {
inner: $tag.to_string().into(), // inner: $tag.to_string().into(),
}), // }),
)); // ));
} // }
tag($tag)($input) // tag($tag)($input)
}}; // }};
} //}
macro_rules! arg_chk { macro_rules! arg_chk {
(start $check:ident, $input:expr) => {{ (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> { pub fn usize_c(input: &[u8]) -> IResult<&[u8], usize> {
map_res( map_res(
map_res(digit1, std::str::from_utf8), map_res(digit1, std::str::from_utf8),
@ -92,7 +98,6 @@ pub fn listing_action(input: &[u8]) -> IResult<&[u8], Result<Action, CommandErro
import, import,
search, search,
select, select,
toggle_thread_snooze,
open_in_new_tab, open_in_new_tab,
export_mbox, export_mbox,
_tag, _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>> { pub fn compose_action(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
alt(( alt((add_attachment, mailto, remove_attachment, save_draft))(input)
add_attachment,
mailto,
remove_attachment,
toggle_sign,
toggle_encrypt,
save_draft,
))(input)
} }
pub fn account_action(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> { 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, new_tab,
account_action, account_action,
print_setting, print_setting,
toggle_mouse, toggle,
reload_config, reload_config,
quit, quit,
))(input) ))(input)
@ -326,17 +324,6 @@ pub fn sort_column(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>>
let (input, _) = eof(input)?; let (input, _) = eof(input)?;
Ok((input, Ok(SortColumn(i, order)))) 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>> { pub fn search(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
let mut check = arg_init! { min_arg:1, max_arg:{ u8::MAX}, search}; let mut check = arg_init! { min_arg:1, max_arg:{ u8::MAX}, search};
let (input, _) = tag("search")(input.trim())?; 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)?; let (input, _) = eof(input)?;
Ok((input, Ok(Compose(SaveDraft)))) 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>> { 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 mut check = arg_init! { min_arg:1, max_arg: 1, create_malbox};
let (input, _) = tag("create-mailbox")(input.trim())?; 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)?; let (input, _) = eof(input)?;
Ok((input, Ok(PrintSetting(setting.to_string())))) Ok((input, Ok(PrintSetting(setting.to_string()))))
} }
pub fn toggle_mouse(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> { pub fn toggle(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
let mut check = arg_init! { min_arg:1, max_arg: 1, toggle_mouse}; let mut check = arg_init! { min_arg:1, max_arg: 1, toggle };
let (input, _) = tag("toggle")(input.trim())?; let (input, _) = tag("toggle")(input.trim())?;
arg_chk!(start check, input); arg_chk!(start check, input);
let (input, _) = is_a(" ")(input)?; let (mut input, _) = is_a(" ")(input)?;
arg_chk!(inc check, 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); arg_chk!(finish check, input);
let (input, _) = eof(input)?; let (input, _) = eof(input)?;
Ok((input, Ok(ToggleMouse))) Ok((input, Ok(retval)))
} }
pub fn manage_mailboxes(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> { pub fn manage_mailboxes(input: &[u8]) -> IResult<&[u8], Result<Action, CommandError>> {
let mut check = arg_init! { min_arg:0, max_arg: 0, manage_mailboxes}; let mut check = arg_init! { min_arg:0, max_arg: 0, manage_mailboxes};