Wasm/Interpret/ModuleExportsImporter.cs
using WasmBox.Wasm.Optimize;

namespace WasmBox.Wasm.Interpret {
    /// <summary>
    /// An importer that imports a module instance's exported values.
    /// </summary>
    public sealed class ModuleExportsImporter : IImporter {
        /// <summary>
        /// Creates an importer for a module's exports.
        /// </summary>
        /// <param name="module">A module whose exports are imported by the resulting importer.</param>
        public ModuleExportsImporter(ModuleInstance module) {
            this.Module = module;
        }

        /// <summary>
        /// Gets the module instance whose exported values are imported by this importer.
        /// </summary>
        /// <value>A module instance.</value>
        public ModuleInstance Module { get; private set; }

        /// <inheritdoc/>
        public FunctionDefinition ImportFunction(ImportedFunction description, FunctionType signature) {
            if (Module.ExportedFunctions.TryGetValue(description.FieldName, out FunctionDefinition result)
                && ConstFunctionTypeComparer.Instance.Equals(signature, new FunctionType(result.ParameterTypes, result.ReturnTypes))) {
                return result;
            }
            else {
                return null;
            }
        }

        /// <inheritdoc/>
        public Variable ImportGlobal(ImportedGlobal description) {
            if (Module.ExportedGlobals.TryGetValue(description.FieldName, out Variable result)
                && description.Global.ContentType == result.Type
                && description.Global.IsMutable == result.IsMutable) {
                return result;
            }
            else {
                return null;
            }
        }

        /// <inheritdoc/>
        public LinearMemory ImportMemory(ImportedMemory description) {
            if (Module.ExportedMemories.TryGetValue(description.FieldName, out LinearMemory result)
                && result.Limits.Initial >= description.Memory.Limits.Initial) {
                return result;
            }
            else {
                return null;
            }
        }

        /// <inheritdoc/>
        public FunctionTable ImportTable(ImportedTable description) {
            if (Module.ExportedTables.TryGetValue(description.FieldName, out FunctionTable result)
                && result.Limits.Initial >= description.Table.Limits.Initial) {
                return result;
            }
            else {
                return null;
            }
        }
    }
}