Packages

Various modules and helpers for working with Nimiq primitives in the Gleam programming language or as a CLI

Current section

Files

Jump to
nimiq_gleam src utils@serde.erl
Raw

src/utils@serde.erl

-module(utils@serde).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([serialize_bytes/2, deserialize_bytes/1, serialize_string/2, deserialize_string/1, serialize_int/3, deserialize_int/2, serialize_bool/2, deserialize_bool/1]).
-spec serialize_bytes(gleam@bytes_builder:bytes_builder(), bitstring()) -> gleam@bytes_builder:bytes_builder().
serialize_bytes(Buf, Data) ->
_pipe = Buf,
_pipe@1 = gleam@bytes_builder:append(
_pipe,
'Elixir.Varint.LEB128':encode(erlang:byte_size(Data))
),
gleam@bytes_builder:append(_pipe@1, Data).
-spec deserialize_bytes(bitstring()) -> {ok, {bitstring(), bitstring()}} |
{error, binary()}.
deserialize_bytes(Buf) ->
{Len, Rest} = 'Elixir.Varint.LEB128':decode(Buf),
case Rest of
<<Data:Len/binary-unit:8, Rest@1/bitstring>> ->
{ok, {Data, Rest@1}};
_ ->
{error, <<"Invalid bytes: out of data"/utf8>>}
end.
-spec serialize_string(gleam@bytes_builder:bytes_builder(), binary()) -> gleam@bytes_builder:bytes_builder().
serialize_string(Buf, Str) ->
_pipe = Buf,
_pipe@1 = gleam@bytes_builder:append(
_pipe,
'Elixir.Varint.LEB128':encode(erlang:byte_size(Str))
),
gleam@bytes_builder:append_string(_pipe@1, Str).
-spec deserialize_string(bitstring()) -> {ok, {binary(), bitstring()}} |
{error, binary()}.
deserialize_string(Buf) ->
{Len, Rest} = 'Elixir.Varint.LEB128':decode(Buf),
case Rest of
<<Data:Len/binary-unit:8, Rest@1/bitstring>> ->
case gleam@bit_array:to_string(Data) of
{ok, Str} ->
{ok, {Str, Rest@1}};
{error, _} ->
{error, <<"Invalid string: invalid UTF-8"/utf8>>}
end;
_ ->
{error, <<"Invalid string: out of data"/utf8>>}
end.
-spec serialize_int(gleam@bytes_builder:bytes_builder(), integer(), integer()) -> gleam@bytes_builder:bytes_builder().
serialize_int(Buf, Num, Bit_size) ->
_pipe = Buf,
gleam@bytes_builder:append(_pipe, <<Num:(lists:max([(Bit_size), 0]))>>).
-spec deserialize_int(bitstring(), integer()) -> {ok, {integer(), bitstring()}} |
{error, binary()}.
deserialize_int(Buf, Bit_size) ->
case Buf of
<<Num:Bit_size, Rest/bitstring>> ->
{ok, {Num, Rest}};
_ ->
{error, <<"Invalid number: out of data"/utf8>>}
end.
-spec serialize_bool(gleam@bytes_builder:bytes_builder(), boolean()) -> gleam@bytes_builder:bytes_builder().
serialize_bool(Buf, Value) ->
serialize_int(Buf, gleam@bool:to_int(Value), 8).
-spec deserialize_bool(bitstring()) -> {ok, {boolean(), bitstring()}} |
{error, binary()}.
deserialize_bool(Buf) ->
case Buf of
<<0:8, Rest/bitstring>> ->
{ok, {false, Rest}};
<<1:8, Rest@1/bitstring>> ->
{ok, {true, Rest@1}};
_ ->
{error, <<"Invalid bool: out of data"/utf8>>}
end.