Expand description
One goal of wasi-common
is for multiple WASI snapshots to provide an
interface to the same underlying crate::WasiCtx
. This provides us a path
to evolve WASI by allowing the same WASI Command to import functions from
different snapshots - e.g. the user could use Rust’s std
which imports
snapshot 1, but also depend directly on the wasi
crate which imports
some future snapshot 2. Right now, this amounts to supporting snapshot 1
and “snapshot 0” aka wasi_unstable at once.
The architectural rules for snapshots are:
- Snapshots are arranged into modules under
crate::snapshots::
. - Each snapshot should invoke
wiggle::from_witx!
withctx: crate::WasiCtx
in its module, and impl all of the required traits. - Snapshots can be implemented in terms of other snapshots. For example,
snapshot 0 is mostly implemented by calling the snapshot 1 implementation,
and converting its own types back and forth with the snapshot 1 types. In a
few cases, that is not feasible, so snapshot 0 carries its own
implementations in terms of the
WasiFile
andWasiSched
traits. - Snapshots can be implemented in terms of the
Wasi*
traits given byWasiCtx
. No further downcasting via theas_any
escape hatch is permitted.