aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse/mod.rs
diff options
context:
space:
mode:
authorJonas Maier <>2026-04-19 12:13:35 +0200
committerJonas Maier <>2026-04-19 12:13:35 +0200
commit8fe815e4c1e70e6774ebfa30ff8c50e86f72a2c1 (patch)
tree9bc1f9545338f12df78195abc85dccc4bbb5d643 /src/parse/mod.rs
parent25d39711c53862633d75163e2f7e31a26b0dd18f (diff)
downloadpish-8fe815e4c1e70e6774ebfa30ff8c50e86f72a2c1.tar.gz
alias: parses more than the first word in each argument
Diffstat (limited to 'src/parse/mod.rs')
-rw-r--r--src/parse/mod.rs22
1 files changed, 21 insertions, 1 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)
}
}