From 6d396041ed8c00f6ac58a1b90473ec7ea5db43d8 Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Sat, 7 Mar 2026 11:19:57 +0100 Subject: parse builtin that emits compact ast --- src/run/builtin.rs | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'src/run/builtin.rs') 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>, + 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)) } + } +} -- cgit v1.2.3