use wit_parser::{Resolve, SourceMap};
use super::error::Wasip2Error;
pub fn push_wasi_packages(resolve: &mut Resolve) -> Result<(), Wasip2Error> {
const PACKAGE_ORDER: &[&str] = &[
"io",
"clocks",
"random",
"filesystem",
"sockets",
"cli",
"http",
];
for pkg_name in PACKAGE_ORDER {
let mut map = SourceMap::default();
let mut found_any = false;
for (path, contents) in WASI_WIT_FILES {
if package_dir(path) == Some(pkg_name) {
map.push_str(path, *contents);
found_any = true;
}
}
if !found_any {
return Err(Wasip2Error::Wrap(format!(
"vendored WASI bundle is missing files for package `{pkg_name}`"
)));
}
let group = map.parse().map_err(|(_, e)| {
Wasip2Error::Wrap(format!("parse vendored WASI WIT package `{pkg_name}`: {e}"))
})?;
resolve.push_group(group).map_err(|e| {
Wasip2Error::Wrap(format!("push vendored WASI WIT package `{pkg_name}`: {e}"))
})?;
}
Ok(())
}
fn package_dir(path: &str) -> Option<&str> {
path.strip_prefix("wit/wasi-0.2.4/")
.and_then(|rest| rest.split('/').next())
}
const WASI_WIT_FILES: &[(&str, &str)] = &[
(
"wit/wasi-0.2.4/cli/command.wit",
include_str!("../../../wit/wasi-0.2.4/cli/command.wit"),
),
(
"wit/wasi-0.2.4/cli/environment.wit",
include_str!("../../../wit/wasi-0.2.4/cli/environment.wit"),
),
(
"wit/wasi-0.2.4/cli/exit.wit",
include_str!("../../../wit/wasi-0.2.4/cli/exit.wit"),
),
(
"wit/wasi-0.2.4/cli/imports.wit",
include_str!("../../../wit/wasi-0.2.4/cli/imports.wit"),
),
(
"wit/wasi-0.2.4/cli/run.wit",
include_str!("../../../wit/wasi-0.2.4/cli/run.wit"),
),
(
"wit/wasi-0.2.4/cli/stdio.wit",
include_str!("../../../wit/wasi-0.2.4/cli/stdio.wit"),
),
(
"wit/wasi-0.2.4/cli/terminal.wit",
include_str!("../../../wit/wasi-0.2.4/cli/terminal.wit"),
),
(
"wit/wasi-0.2.4/clocks/monotonic-clock.wit",
include_str!("../../../wit/wasi-0.2.4/clocks/monotonic-clock.wit"),
),
(
"wit/wasi-0.2.4/clocks/timezone.wit",
include_str!("../../../wit/wasi-0.2.4/clocks/timezone.wit"),
),
(
"wit/wasi-0.2.4/clocks/wall-clock.wit",
include_str!("../../../wit/wasi-0.2.4/clocks/wall-clock.wit"),
),
(
"wit/wasi-0.2.4/clocks/world.wit",
include_str!("../../../wit/wasi-0.2.4/clocks/world.wit"),
),
(
"wit/wasi-0.2.4/filesystem/preopens.wit",
include_str!("../../../wit/wasi-0.2.4/filesystem/preopens.wit"),
),
(
"wit/wasi-0.2.4/filesystem/types.wit",
include_str!("../../../wit/wasi-0.2.4/filesystem/types.wit"),
),
(
"wit/wasi-0.2.4/filesystem/world.wit",
include_str!("../../../wit/wasi-0.2.4/filesystem/world.wit"),
),
(
"wit/wasi-0.2.4/http/handler.wit",
include_str!("../../../wit/wasi-0.2.4/http/handler.wit"),
),
(
"wit/wasi-0.2.4/http/proxy.wit",
include_str!("../../../wit/wasi-0.2.4/http/proxy.wit"),
),
(
"wit/wasi-0.2.4/http/types.wit",
include_str!("../../../wit/wasi-0.2.4/http/types.wit"),
),
(
"wit/wasi-0.2.4/io/error.wit",
include_str!("../../../wit/wasi-0.2.4/io/error.wit"),
),
(
"wit/wasi-0.2.4/io/poll.wit",
include_str!("../../../wit/wasi-0.2.4/io/poll.wit"),
),
(
"wit/wasi-0.2.4/io/streams.wit",
include_str!("../../../wit/wasi-0.2.4/io/streams.wit"),
),
(
"wit/wasi-0.2.4/io/world.wit",
include_str!("../../../wit/wasi-0.2.4/io/world.wit"),
),
(
"wit/wasi-0.2.4/random/insecure-seed.wit",
include_str!("../../../wit/wasi-0.2.4/random/insecure-seed.wit"),
),
(
"wit/wasi-0.2.4/random/insecure.wit",
include_str!("../../../wit/wasi-0.2.4/random/insecure.wit"),
),
(
"wit/wasi-0.2.4/random/random.wit",
include_str!("../../../wit/wasi-0.2.4/random/random.wit"),
),
(
"wit/wasi-0.2.4/random/world.wit",
include_str!("../../../wit/wasi-0.2.4/random/world.wit"),
),
(
"wit/wasi-0.2.4/sockets/instance-network.wit",
include_str!("../../../wit/wasi-0.2.4/sockets/instance-network.wit"),
),
(
"wit/wasi-0.2.4/sockets/ip-name-lookup.wit",
include_str!("../../../wit/wasi-0.2.4/sockets/ip-name-lookup.wit"),
),
(
"wit/wasi-0.2.4/sockets/network.wit",
include_str!("../../../wit/wasi-0.2.4/sockets/network.wit"),
),
(
"wit/wasi-0.2.4/sockets/tcp-create-socket.wit",
include_str!("../../../wit/wasi-0.2.4/sockets/tcp-create-socket.wit"),
),
(
"wit/wasi-0.2.4/sockets/tcp.wit",
include_str!("../../../wit/wasi-0.2.4/sockets/tcp.wit"),
),
(
"wit/wasi-0.2.4/sockets/udp-create-socket.wit",
include_str!("../../../wit/wasi-0.2.4/sockets/udp-create-socket.wit"),
),
(
"wit/wasi-0.2.4/sockets/udp.wit",
include_str!("../../../wit/wasi-0.2.4/sockets/udp.wit"),
),
(
"wit/wasi-0.2.4/sockets/world.wit",
include_str!("../../../wit/wasi-0.2.4/sockets/world.wit"),
),
];