aboutsummaryrefslogtreecommitdiffstats
path: root/src/builtins.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-07-06 13:13:01 -0400
committerJesse Luehrs <doy@tozt.net>2019-07-06 13:13:01 -0400
commitb341da5771c0bb607caf917b1293153b38a5bf9c (patch)
tree2e33a6026d953bd179316bb48a9298e2f3ab9373 /src/builtins.rs
parentd804b219ee68e9f72b4dc5a1e3678a3e98d9de06 (diff)
downloadnbsh-old-b341da5771c0bb607caf917b1293153b38a5bf9c.tar.gz
nbsh-old-b341da5771c0bb607caf917b1293153b38a5bf9c.zip
have eval streams also emit start events
Diffstat (limited to 'src/builtins.rs')
-rw-r--r--src/builtins.rs40
1 files changed, 25 insertions, 15 deletions
diff --git a/src/builtins.rs b/src/builtins.rs
index d130907..2393e89 100644
--- a/src/builtins.rs
+++ b/src/builtins.rs
@@ -41,6 +41,7 @@ pub fn exec(cmd: &str, args: &[String]) -> Result<Builtin> {
pub struct Builtin {
cmd: String,
args: Vec<String>,
+ started: bool,
done: bool,
}
@@ -50,6 +51,7 @@ impl Builtin {
"cd" => Ok(Self {
cmd: cmd.to_string(),
args: args.to_vec(),
+ started: false,
done: false,
}),
_ => Err(Error::UnknownBuiltin {
@@ -65,22 +67,30 @@ impl futures::stream::Stream for Builtin {
type Error = Error;
fn poll(&mut self) -> futures::Poll<Option<Self::Item>, Self::Error> {
- if self.done {
- return Ok(futures::Async::Ready(None));
+ if !self.started {
+ self.started = true;
+ Ok(futures::Async::Ready(Some(
+ crate::eval::CommandEvent::CommandStart(
+ self.cmd.clone(),
+ self.args.clone(),
+ ),
+ )))
+ } else if !self.done {
+ self.done = true;
+ let res = match self.cmd.as_ref() {
+ "cd" => cd(&self.args),
+ _ => Err(Error::UnknownBuiltin {
+ cmd: self.cmd.clone(),
+ }),
+ };
+ res.map(|_| {
+ futures::Async::Ready(Some(
+ crate::eval::CommandEvent::BuiltinExit,
+ ))
+ })
+ } else {
+ Ok(futures::Async::Ready(None))
}
-
- self.done = true;
- let res = match self.cmd.as_ref() {
- "cd" => cd(&self.args),
- _ => Err(Error::UnknownBuiltin {
- cmd: self.cmd.clone(),
- }),
- };
- res.map(|_| {
- futures::Async::Ready(Some(
- crate::eval::CommandEvent::BuiltinExit,
- ))
- })
}
}