-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 <> -> {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 <> -> 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, <>). -spec deserialize_int(bitstring(), integer()) -> {ok, {integer(), bitstring()}} | {error, binary()}. deserialize_int(Buf, Bit_size) -> case Buf of <> -> {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.