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}