greentic_component/
wasm.rs

1use anyhow::{Result, anyhow};
2use wit_component::{DecodedWasm, metadata};
3use wit_parser::{Resolve, WorldId};
4
5/// Indicates how a world was decoded from a wasm binary.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum WorldSource {
8    /// Metadata was decoded from a core wasm module.
9    Metadata,
10    /// WIT was reconstructed from a fully-fledged component.
11    Component,
12}
13
14/// Resolved world information extracted from a wasm binary.
15pub struct DecodedWorld {
16    pub resolve: Resolve,
17    pub world: WorldId,
18    pub source: WorldSource,
19}
20
21/// Decode a wasm module or component into its WIT world description.
22pub 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}