-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) ).