Packages

An experimental work-in-progress (WIP) WebAssembly runtime written in Gleam.

Current section

Files

Jump to
gwr src module.erl
Raw

src/module.erl

-module(module).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([try_detect_signature/1, get_module_version/1, from_raw_data/1]).
-export_type([module_/0]).
-type module_() :: {module, integer()}.
-spec try_detect_signature(bitstring()) -> boolean().
try_detect_signature(Raw_data) ->
case gleam_stdlib:bit_array_slice(Raw_data, 0, 4) of
{ok, <<16#00, 16#61, 16#73, 16#6d>>} ->
true;
_ ->
false
end.
-spec get_module_version(bitstring()) -> {ok, integer()} | {error, binary()}.
get_module_version(Raw_data) ->
case gleam_stdlib:bit_array_slice(Raw_data, 4, 4) of
{ok, Version_raw_data} ->
gleam@result:'try'(
gleb128:decode_unsigned(Version_raw_data),
fun(Version) -> {ok, erlang:element(1, Version)} end
);
_ ->
{error,
<<"module::get_module_version: can't get module version raw data"/utf8>>}
end.
-spec from_raw_data(bitstring()) -> {ok, module_()} | {error, binary()}.
from_raw_data(Raw_data) ->
case try_detect_signature(Raw_data) of
true ->
gleam@result:'try'(
get_module_version(Raw_data),
fun(Version) -> {ok, {module, Version}} end
);
false ->
{error, <<"Can't detect module signature"/utf8>>}
end.