Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wasi/src/view.rs
1692 views
1
use crate::WasiCtx;
2
use 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
///
36
pub 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.
44
pub 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
51
impl<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
61
impl<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
71
impl<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
81
impl<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
87
impl<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
}
96
97