wast_encoder/instances/
mod.rs

1use std::{
2    collections::{BTreeMap, BTreeSet},
3    fmt::{Debug, Formatter, Write},
4    ops::AddAssign,
5};
6
7use crate::{
8    dag::DependenciesTrace, helpers::ComponentDefine, DependentGraph, Identifier, WasiFunction, WasiModule, WasiResource,
9    WasiType, WastEncoder,
10};
11
12mod convert;
13mod display;
14
15pub struct WasiInstance {
16    pub module: WasiModule,
17    /// language_name: wasi_name
18    pub resources: BTreeMap<Identifier, WasiResource>,
19    pub functions: BTreeMap<Identifier, WasiFunction>,
20}
21
22impl WasiInstance {
23    pub fn new<M>(module: M) -> Self
24    where
25        M: Into<WasiModule>,
26    {
27        Self { module: module.into(), resources: Default::default(), functions: Default::default() }
28    }
29    pub fn insert(&mut self, wasi: &WasiType) {
30        match wasi {
31            WasiType::Integer8 { .. } => {}
32            WasiType::Integer16 { .. } => {}
33            WasiType::Integer32 { .. } => {}
34            WasiType::Integer64 { .. } => {}
35            WasiType::Option { .. } => {
36                todo!()
37            }
38            WasiType::Result { .. } => {
39                todo!()
40            }
41            WasiType::Resource(v) => {
42                self.resources.insert(v.symbol.clone(), v.clone());
43            }
44            WasiType::Variant(_) => {
45                todo!()
46            }
47            WasiType::TypeHandler { .. } => {
48                todo!()
49            }
50
51            WasiType::External(v) => {
52                self.functions.insert(v.symbol.clone(), *v.clone());
53            }
54            WasiType::Array { .. } => {}
55            WasiType::Float32 => {}
56            WasiType::Float64 => {}
57            WasiType::Record(_) => {}
58            WasiType::Boolean => {}
59            WasiType::Function(_) => {}
60        }
61    }
62    pub fn dependencies(&self, dict: &DependentGraph) -> BTreeSet<WasiType> {
63        let mut dependencies = BTreeSet::default();
64        let mut types = vec![];
65        self.functions.values().for_each(|f| f.collect_wasi_types(dict, &mut types));
66        for ty in types {
67            match ty.wasm_module() {
68                Some(s) if s.eq(&self.module) => continue,
69                _ => {
70                    dependencies.insert(ty.clone());
71                }
72            }
73        }
74        dependencies
75    }
76}