aboutsummaryrefslogtreecommitdiffstats
path: root/examples/shell.rs
blob: 682c00840d6b8688e6b3e81cd922d6f1f0619f89 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use futures::future::Future as _;
use futures::stream::Stream as _;
use std::io::Write as _;

mod input;

fn main() {
    let mut argv = std::env::args();
    argv.next().unwrap();
    let cmd = argv.next().unwrap();
    let args: Vec<_> = argv.collect();

    let process = tokio_pty_process_stream::Process::new(
        &cmd,
        &args,
        input::evented_stdin::Stdin::new(),
    );

    let _raw = crossterm::RawScreen::into_raw_mode().unwrap();
    tokio::run(
        process
            .for_each(|ev| {
                match ev {
                    tokio_pty_process_stream::Event::CommandStart {
                        ..
                    } => {}
                    tokio_pty_process_stream::Event::Output { data } => {
                        let stdout = std::io::stdout();
                        let mut stdout = stdout.lock();
                        stdout.write_all(&data).unwrap();
                        stdout.flush().unwrap();
                    }
                    tokio_pty_process_stream::Event::CommandExit {
                        ..
                    } => {}
                }
                futures::future::ok(())
            })
            .map_err(|e| panic!(e)),
    );
}