From e3778b9bb8b6c4bfa9341bd528df41b4e09cce6b Mon Sep 17 00:00:00 2001 From: dusk Date: Fri, 24 Jan 2025 05:16:15 +0900 Subject: [PATCH] refactor(command_parser): move parameter fmt to Parameter types Display impl --- crates/command_parser/src/flag.rs | 4 +-- crates/command_parser/src/parameter.rs | 33 +++++++++++--------- crates/command_parser/src/token.rs | 42 ++++++++++++++------------ 3 files changed, 43 insertions(+), 36 deletions(-) diff --git a/crates/command_parser/src/flag.rs b/crates/command_parser/src/flag.rs index 11eae9b3..fbeb0b1b 100644 --- a/crates/command_parser/src/flag.rs +++ b/crates/command_parser/src/flag.rs @@ -2,7 +2,7 @@ use std::fmt::Display; use smol_str::SmolStr; -use crate::parameter::{ParameterKind, ParameterValue}; +use crate::parameter::{Parameter, ParameterKind, ParameterValue}; #[derive(Debug)] pub enum FlagValueMatchError { @@ -22,7 +22,7 @@ impl Display for Flag { write!(f, "-{}", self.name)?; if let Some(value) = self.value.as_ref() { write!(f, "=")?; - value.format(f, value.default_name())?; + Parameter::from(*value).fmt(f)?; } Ok(()) } diff --git a/crates/command_parser/src/parameter.rs b/crates/command_parser/src/parameter.rs index f7ad07a9..b2c9d5ff 100644 --- a/crates/command_parser/src/parameter.rs +++ b/crates/command_parser/src/parameter.rs @@ -1,4 +1,7 @@ -use std::{fmt::Debug, str::FromStr}; +use std::{ + fmt::{Debug, Display}, + str::FromStr, +}; use smol_str::SmolStr; @@ -30,6 +33,21 @@ impl Parameter { } } +impl Display for Parameter { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self.kind { + ParameterKind::OpaqueString | ParameterKind::OpaqueStringRemainder => { + write!(f, "[{}]", self.name) + } + ParameterKind::MemberRef => write!(f, ""), + ParameterKind::SystemRef => write!(f, ""), + ParameterKind::MemberPrivacyTarget => write!(f, ""), + ParameterKind::PrivacyLevel => write!(f, "[privacy level]"), + ParameterKind::Toggle => write!(f, "on/off"), + } + } +} + impl From for Parameter { fn from(value: ParameterKind) -> Self { Parameter { @@ -76,19 +94,6 @@ impl ParameterKind { matches!(self, ParameterKind::OpaqueStringRemainder) } - pub(crate) fn format(&self, f: &mut std::fmt::Formatter, param_name: &str) -> std::fmt::Result { - match self { - ParameterKind::OpaqueString | ParameterKind::OpaqueStringRemainder => { - write!(f, "[{param_name}]") - } - ParameterKind::MemberRef => write!(f, ""), - ParameterKind::SystemRef => write!(f, ""), - ParameterKind::MemberPrivacyTarget => write!(f, ""), - ParameterKind::PrivacyLevel => write!(f, "[privacy level]"), - ParameterKind::Toggle => write!(f, "on/off"), - } - } - pub(crate) fn match_value(&self, input: &str) -> Result { match self { ParameterKind::OpaqueString | ParameterKind::OpaqueStringRemainder => { diff --git a/crates/command_parser/src/token.rs b/crates/command_parser/src/token.rs index 0d0fce2f..996ee017 100644 --- a/crates/command_parser/src/token.rs +++ b/crates/command_parser/src/token.rs @@ -81,11 +81,12 @@ impl Display for Token { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::Value { name, .. } => write!(f, "{name}"), - Self::Parameter(param) => param.kind().format(f, param.name()), + Self::Parameter(param) => write!(f, "{param}"), } } } +// (name, aliases) -> Token::Value impl From<(&str, [&str; L])> for Token { fn from((name, aliases): (&str, [&str; L])) -> Self { Self::Value { @@ -95,6 +96,7 @@ impl From<(&str, [&str; L])> for Token { } } +// name -> Token::Value impl From<&str> for Token { fn from(value: &str) -> Self { Self::from((value, [])) @@ -119,11 +121,21 @@ impl From<(&str, ParameterKind)> for Token { } } +/// Iterator that produces [`Token`]s. +/// +/// This is more of a convenience type that the [`tokens!`] macro uses in order +/// to more easily combine tokens together. #[derive(Debug, Clone)] pub struct TokensIterator { inner: Vec, } +impl TokensIterator { + pub(crate) fn new(tokens: Vec) -> Self { + Self { inner: tokens } + } +} + impl Iterator for TokensIterator { type Item = Token; @@ -132,37 +144,27 @@ impl Iterator for TokensIterator { } } +impl From> for TokensIterator { + fn from(value: Vec) -> Self { + Self::new(value) + } +} + impl> From for TokensIterator { fn from(value: T) -> Self { - Self { - inner: vec![value.into()], - } + Self::new(vec![value.into()]) } } impl From<[Token; L]> for TokensIterator { fn from(value: [Token; L]) -> Self { - Self { - inner: value.into_iter().collect(), - } + Self::new(value.into_iter().collect()) } } impl From<[Self; L]> for TokensIterator { fn from(value: [Self; L]) -> Self { - Self { - inner: value - .into_iter() - .map(|t| t.collect::>()) - .flatten() - .collect(), - } - } -} - -impl From> for TokensIterator { - fn from(value: Vec) -> Self { - Self { inner: value } + Self::new(value.into_iter().map(|t| t.inner).flatten().collect()) } }