diff --git a/crates/command_definitions/src/message.rs b/crates/command_definitions/src/message.rs index 1f021b27..00a5767f 100644 --- a/crates/command_definitions/src/message.rs +++ b/crates/command_definitions/src/message.rs @@ -1,4 +1,7 @@ -use command_parser::parameter::{MESSAGE_LINK, MESSAGE_REF}; +use command_parser::{ + parameter::{MESSAGE_LINK, MESSAGE_REF}, + token::TokensIterator, +}; use super::*; @@ -11,6 +14,8 @@ pub fn cmds() -> impl IntoIterator { let edit = ("edit", ["e"]); let new_content_param = Optional(Remainder(("new_content", OpaqueString))); + let edit_short_subcmd = tokens!(Optional(MESSAGE_LINK), new_content_param); + let apply_edit = |cmd: Command| { cmd.flag(("append", ["a"])) .flag(("prepend", ["p"])) @@ -20,14 +25,17 @@ pub fn cmds() -> impl IntoIterator { .flag(("clear-attachments", ["clear-attachment", "ca"])) .help("Edits a previously proxied message") }; + let make_edit_cmd = |tokens: TokensIterator| apply_edit(command!(tokens => "message_edit")); [ - apply_edit(command!(edit, Optional(MESSAGE_LINK), new_content_param => "message_edit")), + make_edit_cmd(tokens!(edit, edit_short_subcmd)), + // this one always does regex + make_edit_cmd(tokens!("x", edit_short_subcmd)).flag_value("regex", None), command!(reproxy, Optional(("msg", MESSAGE_REF)), ("member", MemberRef) => "message_reproxy") .help("Reproxies a previously proxied message with a different member"), command!(message, author => "message_author").help("Shows the author of a proxied message"), command!(message, delete => "message_delete").help("Deletes a proxied message"), - apply_edit(command!(message, edit, new_content_param => "message_edit")), + make_edit_cmd(tokens!(message, edit, new_content_param)), command!(message => "message_info") .flag(delete) .flag(author) diff --git a/crates/command_parser/src/command.rs b/crates/command_parser/src/command.rs index 3bbf636d..88434638 100644 --- a/crates/command_parser/src/command.rs +++ b/crates/command_parser/src/command.rs @@ -1,12 +1,12 @@ use std::{ - collections::HashSet, + collections::{HashMap, HashSet}, fmt::{Debug, Display}, sync::Arc, }; use smol_str::SmolStr; -use crate::{flag::Flag, token::Token}; +use crate::{flag::Flag, parameter::ParameterValue, token::Token}; #[derive(Debug, Clone)] pub struct Command { @@ -18,6 +18,7 @@ pub struct Command { pub show_in_suggestions: bool, pub parse_flags_before: usize, pub hidden_flags: HashSet, + pub flag_values: HashMap>, pub original: Option>, } @@ -43,6 +44,7 @@ impl Command { parse_flags_before, tokens, hidden_flags: HashSet::new(), + flag_values: HashMap::new(), original: None, } } @@ -73,6 +75,15 @@ impl Command { self.flags.insert(flag); self } + + pub fn flag_value( + mut self, + flag_name: impl Into, + value: impl Into>, + ) -> Self { + self.flag_values.insert(flag_name.into(), value.into()); + self + } } impl PartialEq for Command { diff --git a/crates/command_parser/src/lib.rs b/crates/command_parser/src/lib.rs index 1c77b88c..6f290667 100644 --- a/crates/command_parser/src/lib.rs +++ b/crates/command_parser/src/lib.rs @@ -350,6 +350,11 @@ pub fn parse_command( .expect("oom"); return Err(error); } + + for (name, value) in &full_cmd.flag_values { + flags.insert(name.to_string(), value.clone()); + } + println!("{} {flags:?} {params:?}", command.cb); return Ok(ParsedCommand { command_def: command,