diff options
| author | Jonas Maier <> | 2026-04-19 12:13:35 +0200 |
|---|---|---|
| committer | Jonas Maier <> | 2026-04-19 12:13:35 +0200 |
| commit | 8fe815e4c1e70e6774ebfa30ff8c50e86f72a2c1 (patch) | |
| tree | 9bc1f9545338f12df78195abc85dccc4bbb5d643 /src | |
| parent | 25d39711c53862633d75163e2f7e31a26b0dd18f (diff) | |
| download | pish-8fe815e4c1e70e6774ebfa30ff8c50e86f72a2c1.tar.gz | |
alias: parses more than the first word in each argument
Diffstat (limited to 'src')
| -rw-r--r-- | src/parse/mod.rs | 22 | ||||
| -rw-r--r-- | src/run/builtin.rs | 6 |
2 files changed, 24 insertions, 4 deletions
diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 184a514..88d0362 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -861,6 +861,21 @@ impl Parse for ExpString { } } +impl Parse for Vec<ExpString> { + fn parse(b: &mut Cursor<'_>) -> Result<Self> { + let mut strings = Vec::new(); + loop { + match ExpString::parse(b) { + Ok(s) => strings.push(s), + Err(ParseError::Eof) => break, + Err(ParseError::NotAString) => break, + Err(e) => Err(e)?, + } + } + Ok(strings) + } +} + #[derive(Debug, Clone, PartialEq)] pub struct Command<T: Stage> { pub cmd: T::Str, @@ -1036,7 +1051,12 @@ pub fn completion_context<E: Expander>(x: &[u8], e: &mut E) -> CompletionContext pub trait Parse: Sized { fn parse(b: &mut Cursor<'_>) -> Result<Self>; fn parse_from_bytes(x: &[u8]) -> Result<Self> { - Self::parse(&mut Cursor::new(x, ParseMode::Command)) + let mut c = Cursor::new(x, ParseMode::Command); + let parsed = Self::parse(&mut c)?; + if c.has() { + return Err(ParseError::Unknown(c.buf[0])); + } + Ok(parsed) } } diff --git a/src/run/builtin.rs b/src/run/builtin.rs index f8c6c4c..7ca1e5e 100644 --- a/src/run/builtin.rs +++ b/src/run/builtin.rs @@ -487,9 +487,9 @@ impl Builtin for alias { let mut parse_fail = false; let mut alias_args = Vec::new(); for arg in args { - match <crate::parse::ExpString as crate::parse::Parse>::parse_from_bytes(&arg[..]) { - Ok(parsed) => { - alias_args.push(parsed); + match <Vec<crate::parse::ExpString> as crate::parse::Parse>::parse_from_bytes(&arg[..]) { + Ok(mut parsed) => { + alias_args.append(&mut parsed); } Err(err) => { writeln!( |
