From 960f735db9c74cab0db959bfb221ab77d47d53ca Mon Sep 17 00:00:00 2001 From: dusk Date: Sun, 23 Nov 2025 14:51:53 +0000 Subject: [PATCH] system refs now first parse for a user ref --- crates/command_parser/src/parameter.rs | 36 ++++++++++++++------------ 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/crates/command_parser/src/parameter.rs b/crates/command_parser/src/parameter.rs index 0d13d773..a7032dca 100644 --- a/crates/command_parser/src/parameter.rs +++ b/crates/command_parser/src/parameter.rs @@ -139,23 +139,10 @@ impl Parameter { ParameterKind::MemberRefs => Ok(ParameterValue::MemberRefs( input.split(' ').map(|s| s.trim().to_string()).collect(), )), - ParameterKind::SystemRef => Ok(ParameterValue::SystemRef(input.into())), - ParameterKind::UserRef => { - if let Ok(user_id) = input.parse::() { - return Ok(ParameterValue::UserRef(user_id)); - } - - static RE: std::sync::LazyLock = - std::sync::LazyLock::new(|| Regex::new(r"<@!?(\\d{17,19})>").unwrap()); - if let Some(captures) = RE.captures(&input) { - return captures[1] - .parse::() - .map(|id| ParameterValue::UserRef(id)) - .map_err(|_| SmolStr::new("invalid user ID")); - } - - Err(SmolStr::new("invalid user ID")) + ParameterKind::SystemRef => { + Ok(parse_user_ref(input).unwrap_or(ParameterValue::SystemRef(input.into()))) } + ParameterKind::UserRef => parse_user_ref(input), ParameterKind::MemberPrivacyTarget => MemberPrivacyTargetKind::from_str(input) .map(|target| ParameterValue::MemberPrivacyTarget(target.as_ref().into())), ParameterKind::GroupPrivacyTarget => GroupPrivacyTargetKind::from_str(input) @@ -328,6 +315,23 @@ impl> From> for Parameter { } } +fn parse_user_ref(input: &str) -> Result { + if let Ok(user_id) = input.parse::() { + return Ok(ParameterValue::UserRef(user_id)); + } + + static RE: std::sync::LazyLock = + std::sync::LazyLock::new(|| Regex::new(r"<@!?(\\d{17,19})>").unwrap()); + if let Some(captures) = RE.captures(&input) { + return captures[1] + .parse::() + .map(|id| ParameterValue::UserRef(id)) + .map_err(|_| SmolStr::new("invalid user ID")); + } + + Err(SmolStr::new("invalid user ID")) +} + macro_rules! impl_enum { ($name:ident ($pretty_name:expr): $($variant:ident),*) => { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]