From c906c757aac0260594beb4c9efde4b0e199512ff Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Thu, 16 Jul 2026 20:03:18 +0800 Subject: refactor(arg): simplify escape handling in char extraction Remove redundant comment lines from pick_string and replace explicit escape mappings in arg macro with a catch-all that handles both literal and control characters --- mingling_picker/src/builtin/pick_string.rs | 2 -- mingling_picker_macros/src/arg.rs | 9 +++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/mingling_picker/src/builtin/pick_string.rs b/mingling_picker/src/builtin/pick_string.rs index 688ac0a..f56571a 100644 --- a/mingling_picker/src/builtin/pick_string.rs +++ b/mingling_picker/src/builtin/pick_string.rs @@ -8,12 +8,10 @@ impl<'a> Pickable<'a> for String { fn tag(ctx: TagPhaseContext) -> Vec { if ctx.arg_info.positional { - // Positional: take the first available position only. ArgMatcher::match_one(ctx.into()) .map(|i| vec![i]) .unwrap_or_default() } else { - // Named: find each flag + its single value. ArgMatcher::match_all(ctx.into()) } } diff --git a/mingling_picker_macros/src/arg.rs b/mingling_picker_macros/src/arg.rs index e273d23..70b27b0 100644 --- a/mingling_picker_macros/src/arg.rs +++ b/mingling_picker_macros/src/arg.rs @@ -161,11 +161,12 @@ fn extract_char(tokens: &[TokenTree]) -> Option { let cs: Vec = s.chars().collect(); if cs.len() >= 3 && cs[0] == '\'' && cs[cs.len() - 1] == '\'' { let inner: String = cs[1..cs.len() - 1].iter().collect(); + // inner is the character between the quotes of a char literal. + // For a literal `'n'`, inner is `"n"` (the character n). + // For an escape `'\n'`, inner is the actual newline character. + // The catch-all handles both literal single chars and escape + // sequences (the escaped char IS the actual control character). match inner.as_str() { - "n" => Some('\n'), - "t" => Some('\t'), - "r" => Some('\r'), - "0" => Some('\0'), "\\\\" => Some('\\'), "\\'" => Some('\''), _ => inner.chars().next(), -- cgit