aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Maier <jonas@x77.dev>2026-05-08 23:27:45 +0200
committerJonas Maier <jonas@x77.dev>2026-05-08 23:27:45 +0200
commit365465ea66d68df515d8cbd66d4f1f0e4411cf29 (patch)
tree0240550bb38ad38b5105e56232278c90a03a1060
parent80f92d26fb1b9e4ca777a4b33d477451b49494d8 (diff)
downloadpish-365465ea66d68df515d8cbd66d4f1f0e4411cf29.tar.gz
heredoc builtin
-rw-r--r--src/run/builtin.rs29
-rw-r--r--src/run/mod.rs1
2 files changed, 27 insertions, 3 deletions
diff --git a/src/run/builtin.rs b/src/run/builtin.rs
index a40ef51..d060911 100644
--- a/src/run/builtin.rs
+++ b/src/run/builtin.rs
@@ -860,7 +860,7 @@ impl Builtin for source {
#[derive(Copy, Clone)]
pub struct Break;
-impl Builtin for Break {
+impl Builtin for Break {
fn name(&self) -> &str {
"break"
}
@@ -879,7 +879,7 @@ impl Builtin for Break {
#[derive(Copy, Clone)]
pub struct Continue;
-impl Builtin for Continue {
+impl Builtin for Continue {
fn name(&self) -> &str {
"continue"
}
@@ -893,4 +893,27 @@ impl Builtin for Continue {
) -> Result {
Err(Error::Continue)
}
-} \ No newline at end of file
+}
+
+#[derive(Copy, Clone)]
+pub struct Here;
+
+impl Builtin for Here {
+ fn name(&self) -> &str {
+ "here"
+ }
+
+ fn io(
+ &self,
+ _session: Arc<Mutex<Session>>,
+ args: &[BString],
+ _stdin: &mut dyn Read,
+ stdout: &mut dyn Write,
+ ) -> Result {
+ if args.is_empty() {
+ return Err(Error::Exit(1));
+ }
+ stdout.write_all(&args[0])?;
+ Ok(())
+ }
+}
diff --git a/src/run/mod.rs b/src/run/mod.rs
index 7770b86..885261b 100644
--- a/src/run/mod.rs
+++ b/src/run/mod.rs
@@ -687,6 +687,7 @@ const BUILTINS: &[&'static dyn BuiltinClone] = &[
&builtin::source,
&builtin::Break,
&builtin::Continue,
+ &builtin::Here,
];
pub fn builtin_map() -> HashMap<BString, &'static dyn BuiltinClone> {