1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
//! `wasmtime-wasi` now supports using multiple snapshots to interface to the //! same `WasiCtx`! //! //! `wasmtime_wasi::Wasi::new(&Store, WasiCtx)` is a struct which owns your //! `WasiCtx` and provides linkage to every available snapshot. //! //! Individual snapshots are available through //! `wasmtime_wasi::snapshots::preview_{0, 1}::Wasi::new(&Store, Rc<RefCell<WasiCtx>>)`. pub use wasi_common::{Error, WasiCtx, WasiDir, WasiFile}; /// Re-export the commonly used wasi-cap-std-sync crate here. This saves /// consumers of this library from having to keep additional dependencies /// in sync. #[cfg(feature = "sync")] pub mod sync { pub use wasi_cap_std_sync::*; super::define_wasi!(block_on); } /// Sync mode is the "default" of this crate, so we also export it at the top /// level. #[cfg(feature = "sync")] pub use sync::*; /// Re-export the wasi-tokio crate here. This saves consumers of this library from having /// to keep additional dependencies in sync. #[cfg(feature = "tokio")] pub mod tokio { pub use wasi_tokio::*; super::define_wasi!(async T: Send); } // The only difference between these definitions for sync vs async is whether // the wasmtime::Funcs generated are async (& therefore need an async Store and an executor to run) // or whether they have an internal "dummy executor" that expects the implementation of all // the async funcs to poll to Ready immediately. #[doc(hidden)] #[macro_export] macro_rules! define_wasi { ($async_mode:tt $($bounds:tt)*) => { use wasmtime::Linker; pub fn add_to_linker<T>( linker: &mut Linker<T>, get_cx: impl Fn(&mut T) -> &mut crate::WasiCtx + Send + Sync + Copy + 'static, ) -> anyhow::Result<()> where $($bounds)* { snapshots::preview_1::add_wasi_snapshot_preview1_to_linker(linker, get_cx)?; snapshots::preview_0::add_wasi_unstable_to_linker(linker, get_cx)?; Ok(()) } pub mod snapshots { pub mod preview_1 { wiggle::wasmtime_integration!({ // The wiggle code to integrate with lives here: target: wasi_common::snapshots::preview_1, // This must be the same witx document as used above. This should be ensured by // the `WASI_ROOT` env variable, which is set in wasi-common's `build.rs`. witx: ["$WASI_ROOT/phases/snapshot/witx/wasi_snapshot_preview1.witx"], errors: { errno => Error }, $async_mode: * }); } pub mod preview_0 { wiggle::wasmtime_integration!({ // The wiggle code to integrate with lives here: target: wasi_common::snapshots::preview_0, // This must be the same witx document as used above. This should be ensured by // the `WASI_ROOT` env variable, which is set in wasi-common's `build.rs`. witx: ["$WASI_ROOT/phases/old/snapshot_0/witx/wasi_unstable.witx"], errors: { errno => Error }, $async_mode: * }); } } } }