operator based command spawning and direction in rust (wip)
Diffstat (limited to 'src/util.rs')
-rw-r--r--src/util.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/util.rs b/src/util.rs
new file mode 100644
index 0000000..b888a3c
--- /dev/null
+++ b/src/util.rs
@@ -0,0 +1,36 @@
+#![allow(non_camel_case_types)]
+
+use std::io::Write;
+
+use crate::{processor::Io, Process};
+
+impl std::fmt::Debug for echo {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(
+ f,
+ "echo {}",
+ String::from_utf8_lossy(self.what).escape_debug()
+ )
+ }
+}
+pub struct echo {
+ what: &'static [u8],
+ written: usize,
+}
+
+unsafe impl Process for echo {
+ fn run(&mut self, on: Io) -> anyhow::Result<usize> {
+ match on {
+ Io::First(mut w) => {
+ let writ = w.write(&self.what[..self.written])?;
+ self.written += writ;
+ Ok(writ)
+ }
+ Io::Middle(..) | Io::Last(_) => unreachable!(),
+ }
+ }
+
+ fn done(&mut self, _: Option<bool>) -> anyhow::Result<bool> {
+ Ok(self.written == self.what.len())
+ }
+}