xref: /wasmtime-44.0.1/crates/wasi/src/p2/stdio.rs (revision d73bd632)
1 use crate::cli::{IsTerminal, WasiCliCtxView};
2 use crate::p2::bindings::cli::{
3     stderr, stdin, stdout, terminal_input, terminal_output, terminal_stderr, terminal_stdin,
4     terminal_stdout,
5 };
6 use wasmtime::component::Resource;
7 use wasmtime_wasi_io::streams;
8 
9 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
10 pub enum IsATTY {
11     Yes,
12     No,
13 }
14 
15 impl stdin::Host for WasiCliCtxView<'_> {
get_stdin(&mut self) -> Result<Resource<streams::DynInputStream>, wasmtime::Error>16     fn get_stdin(&mut self) -> Result<Resource<streams::DynInputStream>, wasmtime::Error> {
17         let stream = self.ctx.stdin.p2_stream();
18         Ok(self.table.push(stream)?)
19     }
20 }
21 
22 impl stdout::Host for WasiCliCtxView<'_> {
get_stdout(&mut self) -> Result<Resource<streams::DynOutputStream>, wasmtime::Error>23     fn get_stdout(&mut self) -> Result<Resource<streams::DynOutputStream>, wasmtime::Error> {
24         let stream = self.ctx.stdout.p2_stream();
25         Ok(self.table.push(stream)?)
26     }
27 }
28 
29 impl stderr::Host for WasiCliCtxView<'_> {
get_stderr(&mut self) -> Result<Resource<streams::DynOutputStream>, wasmtime::Error>30     fn get_stderr(&mut self) -> Result<Resource<streams::DynOutputStream>, wasmtime::Error> {
31         let stream = self.ctx.stderr.p2_stream();
32         Ok(self.table.push(stream)?)
33     }
34 }
35 
36 pub struct TerminalInput;
37 pub struct TerminalOutput;
38 
39 impl terminal_input::Host for WasiCliCtxView<'_> {}
40 impl terminal_input::HostTerminalInput for WasiCliCtxView<'_> {
drop(&mut self, r: Resource<TerminalInput>) -> wasmtime::Result<()>41     fn drop(&mut self, r: Resource<TerminalInput>) -> wasmtime::Result<()> {
42         self.table.delete(r)?;
43         Ok(())
44     }
45 }
46 impl terminal_output::Host for WasiCliCtxView<'_> {}
47 impl terminal_output::HostTerminalOutput for WasiCliCtxView<'_> {
drop(&mut self, r: Resource<TerminalOutput>) -> wasmtime::Result<()>48     fn drop(&mut self, r: Resource<TerminalOutput>) -> wasmtime::Result<()> {
49         self.table.delete(r)?;
50         Ok(())
51     }
52 }
53 impl terminal_stdin::Host for WasiCliCtxView<'_> {
get_terminal_stdin(&mut self) -> wasmtime::Result<Option<Resource<TerminalInput>>>54     fn get_terminal_stdin(&mut self) -> wasmtime::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 }
63 impl terminal_stdout::Host for WasiCliCtxView<'_> {
get_terminal_stdout(&mut self) -> wasmtime::Result<Option<Resource<TerminalOutput>>>64     fn get_terminal_stdout(&mut self) -> wasmtime::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 }
73 impl terminal_stderr::Host for WasiCliCtxView<'_> {
get_terminal_stderr(&mut self) -> wasmtime::Result<Option<Resource<TerminalOutput>>>74     fn get_terminal_stderr(&mut self) -> wasmtime::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 }
83