aboutsummaryrefslogtreecommitdiffstats
path: root/src/run
diff options
context:
space:
mode:
authorJonas Maier <>2026-03-07 11:19:57 +0100
committerJonas Maier <>2026-03-07 11:19:57 +0100
commit6d396041ed8c00f6ac58a1b90473ec7ea5db43d8 (patch)
tree45da4b9400ea36e719812775f4ae0dfbc3a409b6 /src/run
parent6c37d7bcbbd09f7c6478384fc77f780a650ca15c (diff)
downloadpish-6d396041ed8c00f6ac58a1b90473ec7ea5db43d8.tar.gz
parse builtin that emits compact ast
Diffstat (limited to 'src/run')
-rw-r--r--src/run/builtin.rs34
-rw-r--r--src/run/mod.rs1
2 files changed, 34 insertions, 1 deletions
diff --git a/src/run/builtin.rs b/src/run/builtin.rs
index c71f10f..0b2b3bc 100644
--- a/src/run/builtin.rs
+++ b/src/run/builtin.rs
@@ -3,7 +3,8 @@
use std::sync::{Arc, Mutex};
use std::{env::*, fs::OpenOptions, path::PathBuf};
-use super::{Builtin, BuiltinResult as Result};
+use super::{Builtin, BuiltinError as Error, BuiltinResult as Result};
+use crate::parse::CmdDisplay;
use crate::*;
pub struct cd;
@@ -242,3 +243,34 @@ impl Builtin for escape {
Ok(())
}
}
+
+pub struct parse;
+impl Builtin for parse {
+ fn name(&self) -> &str {
+ "parse"
+ }
+
+ fn io(
+ &self,
+ _session: Arc<Mutex<Session>>,
+ args: &[BString],
+ _stdin: &mut dyn Read,
+ stdout: &mut dyn Write,
+ ) -> Result {
+ let mut is_ok = true;
+ for arg in args {
+ match crate::parse::do_parse(arg) {
+ Ok(parsed) => {
+ write!(stdout, "ok ")?;
+ parsed.cdisplay(stdout)?;
+ writeln!(stdout)?;
+ },
+ Err(err) => {
+ is_ok = false;
+ writeln!(stdout, "err {err:?}")?;
+ }
+ }
+ }
+ if is_ok { Ok(()) } else { Err(Error::Exit(-1)) }
+ }
+}
diff --git a/src/run/mod.rs b/src/run/mod.rs
index 2d137c6..c0a108a 100644
--- a/src/run/mod.rs
+++ b/src/run/mod.rs
@@ -305,6 +305,7 @@ const BUILTINS: &[&'static dyn Builtin] = &[
&builtin::_type,
&builtin::history,
&builtin::escape,
+ &builtin::parse,
];
pub struct CommandDispatch {