Packages

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

Current section

Files

Jump to
gwr src gwr@parser@binary_reader.erl
Raw

src/gwr@parser@binary_reader.erl

-module(gwr@parser@binary_reader).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([create/1, bytes_read/1, is_empty/1, can_read/1, read/2, advance/2, get_remaining/1, read_remaining/1]).
-export_type([binary_reader/0]).
-type binary_reader() :: {binary_reader, bitstring(), integer()}.
-spec create(bitstring()) -> binary_reader().
create(Data) ->
{binary_reader, Data, 0}.
-spec bytes_read(binary_reader()) -> integer().
bytes_read(Reader) ->
erlang:element(3, Reader).
-spec is_empty(binary_reader()) -> boolean().
is_empty(Reader) ->
erlang:element(2, Reader) =:= <<>>.
-spec can_read(binary_reader()) -> boolean().
can_read(Reader) ->
erlang:element(3, Reader) < erlang:byte_size(erlang:element(2, Reader)).
-spec read(binary_reader(), integer()) -> {ok, {binary_reader(), bitstring()}} |
{error, binary()}.
read(Reader, Count) ->
gleam@bool:guard(
(erlang:element(3, Reader) + Count) > erlang:byte_size(
erlang:element(2, Reader)
),
{error, <<"no enough bytes"/utf8>>},
fun() ->
case gleam_stdlib:bit_array_slice(
erlang:element(2, Reader),
erlang:element(3, Reader),
Count
) of
{ok, Data_read} ->
{ok,
{{binary_reader,
erlang:element(2, Reader),
erlang:element(3, Reader) + Count},
Data_read}};
_ ->
{error, <<""/utf8>>}
end
end
).
-spec advance(binary_reader(), integer()) -> binary_reader().
advance(Reader, Count) ->
erlang:setelement(3, Reader, erlang:element(3, Reader) + Count).
-spec get_remaining(binary_reader()) -> {ok, bitstring()} | {error, binary()}.
get_remaining(Reader) ->
case gleam_stdlib:bit_array_slice(
erlang:element(2, Reader),
erlang:element(3, Reader),
erlang:byte_size(erlang:element(2, Reader)) - erlang:element(3, Reader)
) of
{ok, Remaining_data} ->
{ok, Remaining_data};
_ ->
{error, <<""/utf8>>}
end.
-spec read_remaining(binary_reader()) -> {ok, {binary_reader(), bitstring()}} |
{error, binary()}.
read_remaining(Reader) ->
read(
Reader,
erlang:byte_size(erlang:element(2, Reader)) - erlang:element(3, Reader)
).