greentic_component/
wasm.rs1use anyhow::{Result, anyhow};
2use wit_component::{DecodedWasm, metadata};
3use wit_parser::{Resolve, WorldId};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum WorldSource {
8 Metadata,
10 Component,
12}
13
14pub struct DecodedWorld {
16 pub resolve: Resolve,
17 pub world: WorldId,
18 pub source: WorldSource,
19}
20
21pub fn decode_world(bytes: &[u8]) -> Result<DecodedWorld> {
23 match metadata::decode(bytes) {
24 Ok((_maybe_module, bindgen)) => Ok(DecodedWorld {
25 resolve: bindgen.resolve,
26 world: bindgen.world,
27 source: WorldSource::Metadata,
28 }),
29 Err(module_err) => match wit_component::decode(bytes) {
30 Ok(DecodedWasm::Component(resolve, world)) => Ok(DecodedWorld {
31 resolve,
32 world,
33 source: WorldSource::Component,
34 }),
35 Ok(DecodedWasm::WitPackage(_, _)) => Err(module_err),
36 Err(component_err) => Err(anyhow!(
37 "failed to decode module metadata ({module_err}) and component ({component_err})"
38 )),
39 },
40 }
41}