aboutsummaryrefslogtreecommitdiffstats
path: root/src/run
diff options
context:
space:
mode:
authorJonas Maier <>2026-05-22 17:44:24 +0200
committerJonas Maier <>2026-05-22 17:44:24 +0200
commit07daff9331dbdc607584edbf1a8fb3e415c338ea (patch)
tree4742c87aba7748652bd8ea9da7be01607d4d1555 /src/run
parent9a727206f1c94f7580e79a5355adc4b932ae6345 (diff)
downloadpish-07daff9331dbdc607584edbf1a8fb3e415c338ea.tar.gz
lenient block parsing for completion
Diffstat (limited to 'src/run')
-rw-r--r--src/run/builtin.rs34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/run/builtin.rs b/src/run/builtin.rs
index 488ee04..638cfcd 100644
--- a/src/run/builtin.rs
+++ b/src/run/builtin.rs
@@ -6,7 +6,6 @@ use std::{env::*, fs::OpenOptions, path::PathBuf};
use pish_derive::FromArgs;
use super::{Builtin, BuiltinError as Error, BuiltinResult as Result};
-use crate::parse::CmdDisplay;
use crate::run::{AliasAge, AliasBody};
use crate::*;
@@ -354,16 +353,39 @@ impl Builtin for parse {
_stdin: &mut dyn Read,
stdout: &mut dyn Write,
) -> Result {
+ use crate::parse::*;
+
+ let mut parse_mode = ParseMode::Command;
+ let mut backtrace = false;
+
for arg in args {
- match crate::parse::do_parse(arg) {
+ match &arg[..] {
+ b"-c" | b"--completion" => {
+ parse_mode = ParseMode::Completion;
+ continue;
+ }
+ b"-e" | b"--execution" => {
+ parse_mode = ParseMode::Command;
+ continue;
+ }
+ b"--bt" | b"--backtrace" => {
+ backtrace = !backtrace;
+ }
+ _ => {}
+ }
+
+ let mut c = crate::parse::Cursor::new(arg, parse_mode);
+ c.backtrace = backtrace;
+
+ match Ast::parse(&mut c) {
Ok(parsed) => {
write!(stdout, "ok ")?;
parsed.cdisplay(stdout)?;
- writeln!(stdout)?;
+ writeln!(stdout, "\n{parsed:?}")?;
}
- Err(err) => {
- writeln!(stdout, "err {:?} ", err.0)?;
- stdout.write_all(&err.1)?;
+ Err(e) => {
+ writeln!(stdout, "err {e:?} ")?;
+ stdout.write_all(&c.remaining())?;
}
}
}