Skip to content

Commit 7315a82

Browse files
authored
Mirror WASIp{2,3} cli implementations (#11378)
* Mirror WASIp{2,3} cli implementations This is an implementation of #11362 but for the `wasi:cli` implementation of WASIp2. * Fix unused field without p3
1 parent 2eda638 commit 7315a82

9 files changed

Lines changed: 88 additions & 79 deletions

File tree

crates/wasi/src/cli.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::p2;
22
use std::pin::Pin;
33
use std::sync::Arc;
44
use tokio::io::{AsyncRead, AsyncWrite, empty};
5+
use wasmtime::component::{HasData, ResourceTable};
56
use wasmtime_wasi_io::streams::{InputStream, OutputStream};
67

78
mod empty;
@@ -19,13 +20,30 @@ pub use self::locked_async::{AsyncStdinStream, AsyncStdoutStream};
1920
#[doc(no_inline)]
2021
pub use tokio::io::{Stderr, Stdin, Stdout, stderr, stdin, stdout};
2122

23+
pub(crate) struct WasiCli;
24+
25+
impl HasData for WasiCli {
26+
type Data<'a> = WasiCliCtxView<'a>;
27+
}
28+
29+
/// Provides a "view" of `wasi:cli`-related context used to implement host
30+
/// traits.
31+
pub trait WasiCliView: Send {
32+
fn cli(&mut self) -> WasiCliCtxView<'_>;
33+
}
34+
35+
pub struct WasiCliCtxView<'a> {
36+
pub ctx: &'a mut WasiCliCtx,
37+
pub table: &'a mut ResourceTable,
38+
}
39+
2240
pub struct WasiCliCtx {
23-
pub environment: Vec<(String, String)>,
24-
pub arguments: Vec<String>,
25-
pub initial_cwd: Option<String>,
26-
pub stdin: Box<dyn StdinStream>,
27-
pub stdout: Box<dyn StdoutStream>,
28-
pub stderr: Box<dyn StdoutStream>,
41+
pub(crate) environment: Vec<(String, String)>,
42+
pub(crate) arguments: Vec<String>,
43+
pub(crate) initial_cwd: Option<String>,
44+
pub(crate) stdin: Box<dyn StdinStream>,
45+
pub(crate) stdout: Box<dyn StdoutStream>,
46+
pub(crate) stderr: Box<dyn StdoutStream>,
2947
}
3048

3149
impl Default for WasiCliCtx {

crates/wasi/src/p2/host/env.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
use crate::p2::WasiCtxView;
1+
use crate::cli::WasiCliCtxView;
22
use crate::p2::bindings::cli::environment;
33

4-
impl environment::Host for WasiCtxView<'_> {
4+
impl environment::Host for WasiCliCtxView<'_> {
55
fn get_environment(&mut self) -> anyhow::Result<Vec<(String, String)>> {
6-
Ok(self.ctx.cli.environment.clone())
6+
Ok(self.ctx.environment.clone())
77
}
88
fn get_arguments(&mut self) -> anyhow::Result<Vec<String>> {
9-
Ok(self.ctx.cli.arguments.clone())
9+
Ok(self.ctx.arguments.clone())
1010
}
1111
fn initial_cwd(&mut self) -> anyhow::Result<Option<String>> {
12-
// FIXME: expose cwd in builder and save in ctx
13-
Ok(None)
12+
Ok(self.ctx.initial_cwd.clone())
1413
}
1514
}

crates/wasi/src/p2/host/exit.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use crate::I32Exit;
2-
use crate::p2::{WasiCtxView, bindings::cli::exit};
2+
use crate::cli::WasiCliCtxView;
3+
use crate::p2::bindings::cli::exit;
34

4-
impl exit::Host for WasiCtxView<'_> {
5+
impl exit::Host for WasiCliCtxView<'_> {
56
fn exit(&mut self, status: Result<(), ()>) -> anyhow::Result<()> {
67
let status = match status {
78
Ok(()) => 0,

crates/wasi/src/p2/mod.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@
221221
//! [async]: https://docs.rs/wasmtime/latest/wasmtime/struct.Config.html#method.async_support
222222
//! [`ResourceTable`]: wasmtime::component::ResourceTable
223223
224+
use crate::cli::{WasiCli, WasiCliView};
224225
use crate::random::WasiRandom;
225226
use crate::{WasiCtxView, WasiView};
226227
use wasmtime::component::{HasData, Linker, ResourceTable};
@@ -344,16 +345,16 @@ where
344345
random::random::add_to_linker::<T, WasiRandom>(l, |t| &mut t.ctx().ctx.random)?;
345346
random::insecure::add_to_linker::<T, WasiRandom>(l, |t| &mut t.ctx().ctx.random)?;
346347
random::insecure_seed::add_to_linker::<T, WasiRandom>(l, |t| &mut t.ctx().ctx.random)?;
347-
cli::exit::add_to_linker::<T, HasWasi>(l, &options.into(), T::ctx)?;
348-
cli::environment::add_to_linker::<T, HasWasi>(l, T::ctx)?;
349-
cli::stdin::add_to_linker::<T, HasWasi>(l, T::ctx)?;
350-
cli::stdout::add_to_linker::<T, HasWasi>(l, T::ctx)?;
351-
cli::stderr::add_to_linker::<T, HasWasi>(l, T::ctx)?;
352-
cli::terminal_input::add_to_linker::<T, HasWasi>(l, T::ctx)?;
353-
cli::terminal_output::add_to_linker::<T, HasWasi>(l, T::ctx)?;
354-
cli::terminal_stdin::add_to_linker::<T, HasWasi>(l, T::ctx)?;
355-
cli::terminal_stdout::add_to_linker::<T, HasWasi>(l, T::ctx)?;
356-
cli::terminal_stderr::add_to_linker::<T, HasWasi>(l, T::ctx)?;
348+
cli::exit::add_to_linker::<T, WasiCli>(l, &options.into(), T::cli)?;
349+
cli::environment::add_to_linker::<T, WasiCli>(l, T::cli)?;
350+
cli::stdin::add_to_linker::<T, WasiCli>(l, T::cli)?;
351+
cli::stdout::add_to_linker::<T, WasiCli>(l, T::cli)?;
352+
cli::stderr::add_to_linker::<T, WasiCli>(l, T::cli)?;
353+
cli::terminal_input::add_to_linker::<T, WasiCli>(l, T::cli)?;
354+
cli::terminal_output::add_to_linker::<T, WasiCli>(l, T::cli)?;
355+
cli::terminal_stdin::add_to_linker::<T, WasiCli>(l, T::cli)?;
356+
cli::terminal_stdout::add_to_linker::<T, WasiCli>(l, T::cli)?;
357+
cli::terminal_stderr::add_to_linker::<T, WasiCli>(l, T::cli)?;
357358
sockets::tcp_create_socket::add_to_linker::<T, HasWasi>(l, T::ctx)?;
358359
sockets::udp_create_socket::add_to_linker::<T, HasWasi>(l, T::ctx)?;
359360
sockets::instance_network::add_to_linker::<T, HasWasi>(l, T::ctx)?;
@@ -388,9 +389,9 @@ fn add_proxy_interfaces_nonblocking<T: WasiView>(linker: &mut Linker<T>) -> anyh
388389
clocks::wall_clock::add_to_linker::<T, HasWasi>(l, T::ctx)?;
389390
clocks::monotonic_clock::add_to_linker::<T, HasWasi>(l, T::ctx)?;
390391
random::random::add_to_linker::<T, WasiRandom>(l, |t| &mut t.ctx().ctx.random)?;
391-
cli::stdin::add_to_linker::<T, HasWasi>(l, T::ctx)?;
392-
cli::stdout::add_to_linker::<T, HasWasi>(l, T::ctx)?;
393-
cli::stderr::add_to_linker::<T, HasWasi>(l, T::ctx)?;
392+
cli::stdin::add_to_linker::<T, WasiCli>(l, T::cli)?;
393+
cli::stdout::add_to_linker::<T, WasiCli>(l, T::cli)?;
394+
cli::stderr::add_to_linker::<T, WasiCli>(l, T::cli)?;
394395
Ok(())
395396
}
396397

crates/wasi/src/p2/stdio.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
use crate::cli::IsTerminal;
2-
use crate::p2::WasiCtxView;
1+
use crate::cli::{IsTerminal, WasiCliCtxView};
32
use crate::p2::bindings::cli::{
43
stderr, stdin, stdout, terminal_input, terminal_output, terminal_stderr, terminal_stdin,
54
terminal_stdout,
@@ -13,67 +12,67 @@ pub enum IsATTY {
1312
No,
1413
}
1514

16-
impl stdin::Host for WasiCtxView<'_> {
15+
impl stdin::Host for WasiCliCtxView<'_> {
1716
fn get_stdin(&mut self) -> Result<Resource<streams::DynInputStream>, anyhow::Error> {
18-
let stream = self.ctx.cli.stdin.p2_stream();
17+
let stream = self.ctx.stdin.p2_stream();
1918
Ok(self.table.push(stream)?)
2019
}
2120
}
2221

23-
impl stdout::Host for WasiCtxView<'_> {
22+
impl stdout::Host for WasiCliCtxView<'_> {
2423
fn get_stdout(&mut self) -> Result<Resource<streams::DynOutputStream>, anyhow::Error> {
25-
let stream = self.ctx.cli.stdout.p2_stream();
24+
let stream = self.ctx.stdout.p2_stream();
2625
Ok(self.table.push(stream)?)
2726
}
2827
}
2928

30-
impl stderr::Host for WasiCtxView<'_> {
29+
impl stderr::Host for WasiCliCtxView<'_> {
3130
fn get_stderr(&mut self) -> Result<Resource<streams::DynOutputStream>, anyhow::Error> {
32-
let stream = self.ctx.cli.stderr.p2_stream();
31+
let stream = self.ctx.stderr.p2_stream();
3332
Ok(self.table.push(stream)?)
3433
}
3534
}
3635

3736
pub struct TerminalInput;
3837
pub struct TerminalOutput;
3938

40-
impl terminal_input::Host for WasiCtxView<'_> {}
41-
impl terminal_input::HostTerminalInput for WasiCtxView<'_> {
39+
impl terminal_input::Host for WasiCliCtxView<'_> {}
40+
impl terminal_input::HostTerminalInput for WasiCliCtxView<'_> {
4241
fn drop(&mut self, r: Resource<TerminalInput>) -> anyhow::Result<()> {
4342
self.table.delete(r)?;
4443
Ok(())
4544
}
4645
}
47-
impl terminal_output::Host for WasiCtxView<'_> {}
48-
impl terminal_output::HostTerminalOutput for WasiCtxView<'_> {
46+
impl terminal_output::Host for WasiCliCtxView<'_> {}
47+
impl terminal_output::HostTerminalOutput for WasiCliCtxView<'_> {
4948
fn drop(&mut self, r: Resource<TerminalOutput>) -> anyhow::Result<()> {
5049
self.table.delete(r)?;
5150
Ok(())
5251
}
5352
}
54-
impl terminal_stdin::Host for WasiCtxView<'_> {
53+
impl terminal_stdin::Host for WasiCliCtxView<'_> {
5554
fn get_terminal_stdin(&mut self) -> anyhow::Result<Option<Resource<TerminalInput>>> {
56-
if self.ctx.cli.stdin.is_terminal() {
55+
if self.ctx.stdin.is_terminal() {
5756
let fd = self.table.push(TerminalInput)?;
5857
Ok(Some(fd))
5958
} else {
6059
Ok(None)
6160
}
6261
}
6362
}
64-
impl terminal_stdout::Host for WasiCtxView<'_> {
63+
impl terminal_stdout::Host for WasiCliCtxView<'_> {
6564
fn get_terminal_stdout(&mut self) -> anyhow::Result<Option<Resource<TerminalOutput>>> {
66-
if self.ctx.cli.stdout.is_terminal() {
65+
if self.ctx.stdout.is_terminal() {
6766
let fd = self.table.push(TerminalOutput)?;
6867
Ok(Some(fd))
6968
} else {
7069
Ok(None)
7170
}
7271
}
7372
}
74-
impl terminal_stderr::Host for WasiCtxView<'_> {
73+
impl terminal_stderr::Host for WasiCliCtxView<'_> {
7574
fn get_terminal_stderr(&mut self) -> anyhow::Result<Option<Resource<TerminalOutput>>> {
76-
if self.ctx.cli.stderr.is_terminal() {
75+
if self.ctx.stderr.is_terminal() {
7776
let fd = self.table.push(TerminalOutput)?;
7877
Ok(Some(fd))
7978
} else {

crates/wasi/src/p3/cli/host.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::I32Exit;
2-
use crate::cli::IsTerminal;
2+
use crate::cli::{IsTerminal, WasiCli, WasiCliCtxView};
33
use crate::p3::DEFAULT_BUFFER_CAPACITY;
44
use crate::p3::bindings::cli::{
55
environment, exit, stderr, stdin, stdout, terminal_input, terminal_output, terminal_stderr,
66
terminal_stdin, terminal_stdout,
77
};
8-
use crate::p3::cli::{TerminalInput, TerminalOutput, WasiCli, WasiCliCtxView};
8+
use crate::p3::cli::{TerminalInput, TerminalOutput};
99
use anyhow::{Context as _, anyhow};
1010
use bytes::BytesMut;
1111
use std::io::Cursor;

crates/wasi/src/p3/cli/mod.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
11
mod host;
22

3-
use crate::cli::WasiCliCtx;
3+
use crate::cli::{WasiCli, WasiCliView};
44
use crate::p3::bindings::cli;
5-
use wasmtime::component::{HasData, Linker, ResourceTable};
6-
7-
pub struct WasiCliCtxView<'a> {
8-
pub ctx: &'a mut WasiCliCtx,
9-
pub table: &'a mut ResourceTable,
10-
}
11-
12-
pub trait WasiCliView: Send {
13-
fn cli(&mut self) -> WasiCliCtxView<'_>;
14-
}
5+
use wasmtime::component::Linker;
156

167
/// Add all WASI interfaces from this module into the `linker` provided.
178
///
@@ -28,8 +19,7 @@ pub trait WasiCliView: Send {
2819
/// ```
2920
/// use wasmtime::{Engine, Result, Store, Config};
3021
/// use wasmtime::component::{Linker, ResourceTable};
31-
/// use wasmtime_wasi::cli::WasiCliCtx;
32-
/// use wasmtime_wasi::p3::cli::{WasiCliView, WasiCliCtxView};
22+
/// use wasmtime_wasi::cli::{WasiCliCtx, WasiCliView, WasiCliCtxView};
3323
///
3424
/// fn main() -> Result<()> {
3525
/// let mut config = Config::new();
@@ -95,11 +85,5 @@ where
9585
Ok(())
9686
}
9787

98-
struct WasiCli;
99-
100-
impl HasData for WasiCli {
101-
type Data<'a> = WasiCliCtxView<'a>;
102-
}
103-
10488
pub struct TerminalInput;
10589
pub struct TerminalOutput;

crates/wasi/src/preview1.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
//! }
6464
//! ```
6565
66+
use crate::cli::WasiCliView;
6667
use crate::p2::bindings::{
6768
cli::{
6869
stderr::Host as _, stdin::Host as _, stdout::Host as _, terminal_input, terminal_output,
@@ -288,19 +289,21 @@ struct Descriptors {
288289

289290
impl Descriptors {
290291
/// Initializes [Self] using `preopens`
291-
fn new(mut host: WasiCtxView<'_>) -> Result<Self, types::Error> {
292+
fn new(host: &mut WasiP1Ctx) -> Result<Self, types::Error> {
292293
let mut descriptors = Self::default();
293294
descriptors.push(Descriptor::Stdin {
294295
stream: host
296+
.cli()
295297
.get_stdin()
296298
.context("failed to call `get-stdin`")
297299
.map_err(types::Error::trap)?,
298300
isatty: if let Some(term_in) = host
301+
.cli()
299302
.get_terminal_stdin()
300303
.context("failed to call `get-terminal-stdin`")
301304
.map_err(types::Error::trap)?
302305
{
303-
terminal_input::HostTerminalInput::drop(&mut host, term_in)
306+
terminal_input::HostTerminalInput::drop(&mut host.cli(), term_in)
304307
.context("failed to call `drop-terminal-input`")
305308
.map_err(types::Error::trap)?;
306309
IsATTY::Yes
@@ -310,15 +313,17 @@ impl Descriptors {
310313
})?;
311314
descriptors.push(Descriptor::Stdout {
312315
stream: host
316+
.cli()
313317
.get_stdout()
314318
.context("failed to call `get-stdout`")
315319
.map_err(types::Error::trap)?,
316320
isatty: if let Some(term_out) = host
321+
.cli()
317322
.get_terminal_stdout()
318323
.context("failed to call `get-terminal-stdout`")
319324
.map_err(types::Error::trap)?
320325
{
321-
terminal_output::HostTerminalOutput::drop(&mut host, term_out)
326+
terminal_output::HostTerminalOutput::drop(&mut host.cli(), term_out)
322327
.context("failed to call `drop-terminal-output`")
323328
.map_err(types::Error::trap)?;
324329
IsATTY::Yes
@@ -328,15 +333,17 @@ impl Descriptors {
328333
})?;
329334
descriptors.push(Descriptor::Stderr {
330335
stream: host
336+
.cli()
331337
.get_stderr()
332338
.context("failed to call `get-stderr`")
333339
.map_err(types::Error::trap)?,
334340
isatty: if let Some(term_out) = host
341+
.cli()
335342
.get_terminal_stderr()
336343
.context("failed to call `get-terminal-stderr`")
337344
.map_err(types::Error::trap)?
338345
{
339-
terminal_output::HostTerminalOutput::drop(&mut host, term_out)
346+
terminal_output::HostTerminalOutput::drop(&mut host.cli(), term_out)
340347
.context("failed to call `drop-terminal-output`")
341348
.map_err(types::Error::trap)?;
342349
IsATTY::Yes
@@ -346,6 +353,7 @@ impl Descriptors {
346353
})?;
347354

348355
for dir in host
356+
.ctx()
349357
.get_directories()
350358
.context("failed to call `get-directories`")
351359
.map_err(types::Error::trap)?
@@ -507,7 +515,7 @@ impl WasiP1Ctx {
507515
let descriptors = if let Some(descriptors) = self.adapter.descriptors.take() {
508516
descriptors
509517
} else {
510-
Descriptors::new(self.as_wasi_impl())?
518+
Descriptors::new(self)?
511519
};
512520
Ok(Transaction {
513521
view: self,
@@ -1132,7 +1140,7 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiP1Ctx {
11321140
argv: GuestPtr<GuestPtr<u8>>,
11331141
argv_buf: GuestPtr<u8>,
11341142
) -> Result<(), types::Error> {
1135-
self.as_wasi_impl()
1143+
self.cli()
11361144
.get_arguments()
11371145
.context("failed to call `get-arguments`")
11381146
.map_err(types::Error::trap)?
@@ -1155,7 +1163,7 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiP1Ctx {
11551163
_memory: &mut GuestMemory<'_>,
11561164
) -> Result<(types::Size, types::Size), types::Error> {
11571165
let args = self
1158-
.as_wasi_impl()
1166+
.cli()
11591167
.get_arguments()
11601168
.context("failed to call `get-arguments`")
11611169
.map_err(types::Error::trap)?;
@@ -1176,7 +1184,7 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiP1Ctx {
11761184
environ: GuestPtr<GuestPtr<u8>>,
11771185
environ_buf: GuestPtr<u8>,
11781186
) -> Result<(), types::Error> {
1179-
self.as_wasi_impl()
1187+
self.cli()
11801188
.get_environment()
11811189
.context("failed to call `get-environment`")
11821190
.map_err(types::Error::trap)?
@@ -1204,7 +1212,7 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiP1Ctx {
12041212
_memory: &mut GuestMemory<'_>,
12051213
) -> Result<(types::Size, types::Size), types::Error> {
12061214
let environ = self
1207-
.as_wasi_impl()
1215+
.cli()
12081216
.get_environment()
12091217
.context("failed to call `get-environment`")
12101218
.map_err(types::Error::trap)?;

0 commit comments

Comments
 (0)