-module(gwr@execution@instance). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([create/1, call/3]). -export_type([web_assembly_instance/0]). -type web_assembly_instance() :: {web_assembly_instance, gwr@binary:binary_(), gwr@execution@machine:machine()}. -spec create(bitstring()) -> {ok, web_assembly_instance()} | {error, binary()}. create(Data) -> gleam@result:'try'( gwr@parser@binary_parser:parse_binary_module( gwr@parser@binary_reader:create(Data) ), fun(_use0) -> {_, Binary} = _use0, gleam@result:'try'( gwr@execution@machine:initialize(erlang:element(4, Binary)), fun(Machine) -> {ok, {web_assembly_instance, Binary, Machine}} end ) end ). -spec call( web_assembly_instance(), binary(), list(gwr@execution@runtime:value()) ) -> {ok, {web_assembly_instance(), list(gwr@execution@runtime:value())}} | {error, binary()}. call(Instance, Name, Arguments) -> gleam@result:'try'( case gleam@list:find( erlang:element(11, erlang:element(4, erlang:element(2, Instance))), fun(Export) -> case {erlang:element(2, Export) =:= Name, erlang:element(3, Export)} of {true, {function_export, _}} -> true; {_, _} -> false end end ) of {ok, {export, _, {function_export, Index}}} -> {ok, Index}; _ -> {error, <<<<"gwr/execution/instance.call: couldn't find an exported function with name \""/utf8, Name/binary>>/binary, "\" in the given module"/utf8>>} end, fun(Function_index) -> gleam@result:'try'( gwr@execution@machine:call( erlang:element(3, erlang:element(3, Instance)), Function_index, Arguments ), fun(_use0) -> {New_state, Results} = _use0, {ok, {erlang:setelement( 3, Instance, erlang:setelement( 3, erlang:element(3, Instance), New_state ) ), Results}} end ) end ).