diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-07-09 03:04:01 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-07-09 03:04:01 -0400 |
commit | 4f593b410b7d66a8f5e2d0e970f59854938926a7 (patch) | |
tree | d4439d07ed73fa09bab366199fa61b6f48c8fc77 /src/tui.rs | |
parent | b6709ebadff904ddefec07625d198c8fa33a4555 (diff) | |
download | nbsh-old-4f593b410b7d66a8f5e2d0e970f59854938926a7.tar.gz nbsh-old-4f593b410b7d66a8f5e2d0e970f59854938926a7.zip |
move more tui behavior into the state object
Diffstat (limited to 'src/tui.rs')
-rw-r--r-- | src/tui.rs | 42 |
1 files changed, 17 insertions, 25 deletions
@@ -1,5 +1,5 @@ use futures::future::{Future as _, IntoFuture as _}; -use futures::stream::Stream as _; +use futures::sink::Sink as _; use std::io::Write as _; #[derive(Debug, snafu::Snafu)] @@ -12,6 +12,16 @@ pub enum Error { #[snafu(display("error during print: {}", source))] Print { source: crate::state::Error }, + + #[snafu(display("error during sending: {}", source))] + Sending { + source: futures::sync::mpsc::SendError<crate::state::StateEvent>, + }, + + #[snafu(display("error during receiving: {}", source))] + Receiving { + source: futures::sync::oneshot::Canceled, + }, } pub fn tui() { @@ -26,11 +36,12 @@ pub fn tui() { let w = w.clone(); read() .and_then(move |line| { - let w = w.clone(); - eval(&line).for_each(move |event| { - let w = w.clone(); - print(w, idx, &event) - }) + let (res, req) = futures::sync::oneshot::channel(); + w.send(crate::state::StateEvent::Line(idx, line, res)) + .map_err(|e| Error::Sending { source: e }) + .and_then(|_| { + req.map_err(|e| Error::Receiving { source: e }) + }) }) .then(move |res| match res { // successful run or empty input means prompt again @@ -64,25 +75,6 @@ fn read() -> impl futures::future::Future<Item = String, Error = Error> { .map_err(|e| Error::Read { source: e }) } -fn eval( - line: &str, -) -> impl futures::stream::Stream<Item = crate::eval::CommandEvent, Error = Error> -{ - crate::eval::eval(line) - .into_future() - .flatten_stream() - .map_err(|e| Error::Eval { source: e }) -} - -fn print( - w: futures::sync::mpsc::Sender<crate::state::StateEvent>, - idx: usize, - event: &crate::eval::CommandEvent, -) -> impl futures::future::Future<Item = (), Error = Error> { - crate::state::update(w, idx, event) - .map_err(|e| Error::Print { source: e }) -} - fn error(e: &Error) { let stderr = std::io::stderr(); let mut stderr = stderr.lock(); |