use crate::export::Export; use wasmer_types::entity::{BoxedSlice, EntityRef, PrimaryMap}; use wasmer_types::{ExternType, FunctionIndex, ImportIndex, MemoryIndex, TableIndex}; /// Import resolver connects imports with available exported values. pub trait Resolver: Sized { /// Resolves an import a WebAssembly module to an export it's hooked up to. /// /// The `index` provided is the index of the import in the wasm module /// that's being resolved. For example 1 means that it's the second import /// listed in the wasm module. /// /// The `module` and `field` arguments provided are the module/field names /// listed on the import itself. /// /// # Notes: /// /// The index is useful because some WebAssembly modules may rely on that /// for resolving ambiguity in their imports. Such as: /// ```ignore /// (module /// (import "" "" (func)) /// (import "" "" (func (param i32) (result i32))) /// ) /// ``` fn resolve(&self, _index: u32, module: &str, field: &str) -> Option; } /// Import resolver connects imports with available exported values. /// /// This is a specific subtrait for [`Resolver`] for those users who don't /// care about the `index`, but only about the `module` and `field` for /// the resolution. pub trait NamedResolver { /// Resolves an import a WebAssembly module to an export it's hooked up to. /// /// It receives the `module` and `field` names and return the [`Export`] in /// case it's found. fn resolve_by_name(&self, module: &str, field: &str) -> Option; } // All NamedResolvers should extend `Resolver`. impl Resolver for T { /// By default this method will be calling [`NamedResolver::resolve_by_name`], /// dismissing the provided `index`. fn resolve(&self, _index: u32, module: &str, field: &str) -> Option { self.resolve_by_name(module, field) } } impl NamedResolver for &T { fn resolve_by_name(&self, module: &str, field: &str) -> Option { (**self).resolve_by_name(module, field) } } impl NamedResolver for Box { fn resolve_by_name(&self, module: &str, field: &str) -> Option { (**self).resolve_by_name(module, field) } } impl NamedResolver for () { /// Always returns `None`. fn resolve_by_name(&self, _module: &str, _field: &str) -> Option { None } } /// `Resolver` implementation that always resolves to `None`. Equivalent to `()`. pub struct NullResolver {} impl Resolver for NullResolver { fn resolve(&self, _idx: u32, _module: &str, _field: &str) -> Option { None } }