wasmtime_wasi/p2/
stdio.rs

1use crate::cli::{IsTerminal, WasiCliCtxView};
2use crate::p2::bindings::cli::{
3    stderr, stdin, stdout, terminal_input, terminal_output, terminal_stderr, terminal_stdin,
4    terminal_stdout,
5};
6use wasmtime::component::Resource;
7use wasmtime_wasi_io::streams;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum IsATTY {
11    Yes,
12    No,
13}
14
15impl stdin::Host for WasiCliCtxView<'_> {
16    fn get_stdin(&mut self) -> Result<Resource<streams::DynInputStream>, anyhow::Error> {
17        let stream = self.ctx.stdin.p2_stream();
18        Ok(self.table.push(stream)?)
19    }
20}
21
22impl stdout::Host for WasiCliCtxView<'_> {
23    fn get_stdout(&mut self) -> Result<Resource<streams::DynOutputStream>, anyhow::Error> {
24        let stream = self.ctx.stdout.p2_stream();
25        Ok(self.table.push(stream)?)
26    }
27}
28
29impl stderr::Host for WasiCliCtxView<'_> {
30    fn get_stderr(&mut self) -> Result<Resource<streams::DynOutputStream>, anyhow::Error> {
31        let stream = self.ctx.stderr.p2_stream();
32        Ok(self.table.push(stream)?)
33    }
34}
35
36pub struct TerminalInput;
37pub struct TerminalOutput;
38
39impl terminal_input::Host for WasiCliCtxView<'_> {}
40impl terminal_input::HostTerminalInput for WasiCliCtxView<'_> {
41    fn drop(&mut self, r: Resource<TerminalInput>) -> anyhow::Result<()> {
42        self.table.delete(r)?;
43        Ok(())
44    }
45}
46impl terminal_output::Host for WasiCliCtxView<'_> {}
47impl terminal_output::HostTerminalOutput for WasiCliCtxView<'_> {
48    fn drop(&mut self, r: Resource<TerminalOutput>) -> anyhow::Result<()> {
49        self.table.delete(r)?;
50        Ok(())
51    }
52}
53impl terminal_stdin::Host for WasiCliCtxView<'_> {
54    fn get_terminal_stdin(&mut self) -> anyhow::Result<Option<Resource<TerminalInput>>> {
55        if self.ctx.stdin.is_terminal() {
56            let fd = self.table.push(TerminalInput)?;
57            Ok(Some(fd))
58        } else {
59            Ok(None)
60        }
61    }
62}
63impl terminal_stdout::Host for WasiCliCtxView<'_> {
64    fn get_terminal_stdout(&mut self) -> anyhow::Result<Option<Resource<TerminalOutput>>> {
65        if self.ctx.stdout.is_terminal() {
66            let fd = self.table.push(TerminalOutput)?;
67            Ok(Some(fd))
68        } else {
69            Ok(None)
70        }
71    }
72}
73impl terminal_stderr::Host for WasiCliCtxView<'_> {
74    fn get_terminal_stderr(&mut self) -> anyhow::Result<Option<Resource<TerminalOutput>>> {
75        if self.ctx.stderr.is_terminal() {
76            let fd = self.table.push(TerminalOutput)?;
77            Ok(Some(fd))
78        } else {
79            Ok(None)
80        }
81    }
82}