wasmtime_wasi/view.rs
1use crate::WasiCtx;
2use wasmtime::component::ResourceTable;
3
4/// A trait which provides access to the [`WasiCtx`] inside the embedder's `T`
5/// of [`Store<T>`][`Store`].
6///
7/// This crate's WASI Host implementations depend on the contents of
8/// [`WasiCtx`]. The `T` type [`Store<T>`][`Store`] is defined in each
9/// embedding of Wasmtime. These implementations are connected to the
10/// [`Linker<T>`][`Linker`] by [`add_to_linker`](crate::p2::add_to_linker)
11/// functions.
12///
13/// # Example
14///
15/// ```
16/// use wasmtime_wasi::{WasiCtx, WasiCtxView, WasiView};
17/// use wasmtime::component::ResourceTable;
18///
19/// struct MyState {
20/// ctx: WasiCtx,
21/// table: ResourceTable,
22/// }
23///
24/// impl WasiView for MyState {
25/// fn ctx(&mut self) -> WasiCtxView<'_> {
26/// WasiCtxView{
27/// ctx: &mut self.ctx,
28/// table: &mut self.table,
29/// }
30/// }
31/// }
32/// ```
33/// [`Store`]: wasmtime::Store
34/// [`Linker`]: wasmtime::component::Linker
35///
36pub trait WasiView: Send {
37 /// Yields mutable access to the [`WasiCtx`] configuration used for this
38 /// context.
39 fn ctx(&mut self) -> WasiCtxView<'_>;
40}
41
42/// Structure returned from [`WasiView::ctx`] which provides accesss to WASI
43/// state for host functions to be implemented with.
44pub struct WasiCtxView<'a> {
45 /// The [`WasiCtx`], or configuration, of the guest.
46 pub ctx: &'a mut WasiCtx,
47 /// Resources, such as files/streams, that the guest is using.
48 pub table: &'a mut ResourceTable,
49}
50
51impl<T: WasiView> crate::cli::WasiCliView for T {
52 fn cli(&mut self) -> crate::cli::WasiCliCtxView<'_> {
53 let WasiCtxView { ctx, table } = self.ctx();
54 crate::cli::WasiCliCtxView {
55 ctx: &mut ctx.cli,
56 table,
57 }
58 }
59}
60
61impl<T: WasiView> crate::clocks::WasiClocksView for T {
62 fn clocks(&mut self) -> crate::clocks::WasiClocksCtxView<'_> {
63 let WasiCtxView { ctx, table } = self.ctx();
64 crate::clocks::WasiClocksCtxView {
65 ctx: &mut ctx.clocks,
66 table,
67 }
68 }
69}
70
71impl<T: WasiView> crate::filesystem::WasiFilesystemView for T {
72 fn filesystem(&mut self) -> crate::filesystem::WasiFilesystemCtxView<'_> {
73 let WasiCtxView { ctx, table } = self.ctx();
74 crate::filesystem::WasiFilesystemCtxView {
75 ctx: &mut ctx.filesystem,
76 table,
77 }
78 }
79}
80
81impl<T: WasiView> crate::random::WasiRandomView for T {
82 fn random(&mut self) -> &mut crate::random::WasiRandomCtx {
83 &mut self.ctx().ctx.random
84 }
85}
86
87impl<T: WasiView> crate::sockets::WasiSocketsView for T {
88 fn sockets(&mut self) -> crate::sockets::WasiSocketsCtxView<'_> {
89 let WasiCtxView { ctx, table } = self.ctx();
90 crate::sockets::WasiSocketsCtxView {
91 ctx: &mut ctx.sockets,
92 table,
93 }
94 }
95}