wasmtime_wasi/cli/
empty.rs

1use crate::cli::{IsTerminal, StdinStream, StdoutStream};
2use crate::p2;
3use std::pin::Pin;
4use std::task::{Context, Poll};
5use tokio::io::{self, AsyncRead, AsyncWrite};
6use wasmtime_wasi_io::streams::{InputStream, OutputStream};
7
8// Implementation for tokio::io::Empty
9impl IsTerminal for tokio::io::Empty {
10    fn is_terminal(&self) -> bool {
11        false
12    }
13}
14impl StdinStream for tokio::io::Empty {
15    fn p2_stream(&self) -> Box<dyn InputStream> {
16        Box::new(p2::pipe::ClosedInputStream)
17    }
18    fn async_stream(&self) -> Box<dyn AsyncRead + Send + Sync> {
19        Box::new(tokio::io::empty())
20    }
21}
22impl StdoutStream for tokio::io::Empty {
23    fn p2_stream(&self) -> Box<dyn OutputStream> {
24        Box::new(p2::pipe::SinkOutputStream)
25    }
26    fn async_stream(&self) -> Box<dyn AsyncWrite + Send + Sync> {
27        Box::new(tokio::io::empty())
28    }
29}
30
31// Implementation for std::io::Empty
32impl IsTerminal for std::io::Empty {
33    fn is_terminal(&self) -> bool {
34        false
35    }
36}
37impl StdinStream for std::io::Empty {
38    fn p2_stream(&self) -> Box<dyn InputStream> {
39        Box::new(p2::pipe::ClosedInputStream)
40    }
41    fn async_stream(&self) -> Box<dyn AsyncRead + Send + Sync> {
42        Box::new(tokio::io::empty())
43    }
44}
45impl StdoutStream for std::io::Empty {
46    fn p2_stream(&self) -> Box<dyn OutputStream> {
47        Box::new(p2::pipe::SinkOutputStream)
48    }
49    fn async_stream(&self) -> Box<dyn AsyncWrite + Send + Sync> {
50        Box::new(tokio::io::empty())
51    }
52}
53
54// Implementation for p2::pipe::ClosedInputStream
55impl IsTerminal for p2::pipe::ClosedInputStream {
56    fn is_terminal(&self) -> bool {
57        false
58    }
59}
60impl StdinStream for p2::pipe::ClosedInputStream {
61    fn p2_stream(&self) -> Box<dyn InputStream> {
62        Box::new(p2::pipe::ClosedInputStream)
63    }
64    fn async_stream(&self) -> Box<dyn AsyncRead + Send + Sync> {
65        Box::new(tokio::io::empty())
66    }
67}
68
69// Implementation for p2::pipe::SinkOutputStream
70impl IsTerminal for p2::pipe::SinkOutputStream {
71    fn is_terminal(&self) -> bool {
72        false
73    }
74}
75impl StdoutStream for p2::pipe::SinkOutputStream {
76    fn p2_stream(&self) -> Box<dyn OutputStream> {
77        Box::new(p2::pipe::SinkOutputStream)
78    }
79    fn async_stream(&self) -> Box<dyn AsyncWrite + Send + Sync> {
80        Box::new(tokio::io::empty())
81    }
82}
83
84// Implementation for p2::pipe::ClosedOutputStream
85impl IsTerminal for p2::pipe::ClosedOutputStream {
86    fn is_terminal(&self) -> bool {
87        false
88    }
89}
90impl StdoutStream for p2::pipe::ClosedOutputStream {
91    fn p2_stream(&self) -> Box<dyn OutputStream> {
92        Box::new(p2::pipe::ClosedOutputStream)
93    }
94    fn async_stream(&self) -> Box<dyn AsyncWrite + Send + Sync> {
95        struct AlwaysClosed;
96
97        impl AsyncWrite for AlwaysClosed {
98            fn poll_write(
99                self: Pin<&mut Self>,
100                _cx: &mut Context<'_>,
101                _buf: &[u8],
102            ) -> Poll<io::Result<usize>> {
103                Poll::Ready(Ok(0))
104            }
105            fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<()>> {
106                Poll::Ready(Ok(()))
107            }
108            fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<io::Result<()>> {
109                Poll::Ready(Ok(()))
110            }
111        }
112
113        Box::new(AlwaysClosed)
114    }
115}