aboutsummaryrefslogtreecommitdiffstats
path: root/examples/shell.rs
blob: 2cd7ba24d9c71ca9c83785daeb2b26f149ac95ce (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
42
43
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 process = tokio_pty_process_stream::ResizingProcess::new(process);

    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 {
                        ..
                    } => {}
                    tokio_pty_process_stream::Event::Resize { .. } => {}
                }
                futures::future::ok(())
            })
            .map_err(|e| panic!(e)),
    );
}