diff options
| -rw-r--r-- | mingling_picker/src/builtin/pick_string.rs | 2 | ||||
| -rw-r--r-- | 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<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(), |
