nyar_wasm/instances/
mod.rs

1use std::{
2    collections::{BTreeMap, BTreeSet},
3    fmt::{Debug, Formatter, Write},
4    ops::AddAssign,
5};
6
7use crate::{
8    helpers::{ComponentSections, DependenciesTrace},
9    DependentGraph, Identifier, WasiFunction, WasiModule, WasiResource, 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::Function(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::Unicode => {}
60            WasiType::Enums(_) => {}
61            WasiType::Flags(_) => {}
62        }
63    }
64    pub fn dependencies(&self, dict: &DependentGraph) -> BTreeSet<WasiType> {
65        let mut dependencies = BTreeSet::default();
66        let mut types = vec![];
67        self.functions.values().for_each(|f| f.collect_wasi_types(dict, &mut types));
68        for ty in types {
69            match ty.wasm_module() {
70                Some(s) if s.eq(&self.module) => continue,
71                _ => {
72                    dependencies.insert(ty.clone());
73                }
74            }
75        }
76        dependencies
77    }
78}