aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-16 20:03:18 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-16 20:03:18 +0800
commitc906c757aac0260594beb4c9efde4b0e199512ff (patch)
treec430a447d059aba9b6c27134f25a9fd68159500d
parent81049b3abd83115374cfc51b26fb5d5054263f81 (diff)
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
-rw-r--r--mingling_picker/src/builtin/pick_string.rs2
-rw-r--r--mingling_picker_macros/src/arg.rs9
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<usize> {
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<char> {
let cs: Vec<char> = 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(),