Packages
gleam_bson
0.15.0
0.27.0
retired
0.26.0
retired
0.25.0
retired
0.24.0
retired
0.23.0
retired
0.22.0
retired
0.21.0
retired
0.20.0
retired
0.19.0
retired
0.18.0
retired
0.17.0
retired
0.16.0
retired
0.15.0
retired
0.14.0
retired
0.13.0
retired
0.12.0
retired
0.11.0
retired
0.10.1
retired
0.10.0
retired
0.9.0
retired
0.8.0
retired
0.7.0
retired
0.6.0
retired
0.5.0
retired
0.4.0
retired
0.3.0
retired
0.2.0
retired
0.1.0
retired
bson encoder and decoder for gleam
Retired package: Renamed - Republished as bison
Current section
Files
Jump to
Current section
Files
src/bson@encoder.erl
-module(bson@encoder).
-compile(no_auto_import).
-export([encode/1]).
-export_type([entity/0]).
-type entity() :: {entity, bson@types:kind(), bitstring()}.
-spec encode(list({binary(), bson@types:value()})) -> bitstring().
encode(Doc) ->
case document(Doc) of
{entity, _@1, Value} ->
Value
end.
-spec document(list({binary(), bson@types:value()})) -> entity().
document(Doc) ->
Doc@1 = begin
_pipe = Doc,
_pipe@1 = gleam@list:map(_pipe, fun(Kv) -> encode_kv(Kv) end),
gleam@bit_string:concat(_pipe@1)
end,
Size = gleam@bit_string:byte_size(Doc@1) + 5,
{entity,
{kind, <<16#03>>},
begin
_pipe@2 = [<<Size:32/little>>, Doc@1, <<0>>],
gleam@bit_string:concat(_pipe@2)
end}.
-spec encode_kv({binary(), bson@types:value()}) -> bitstring().
encode_kv(Pair) ->
Key = <<(erlang:element(1, Pair))/binary, 0>>,
Value@14 = case erlang:element(2, Pair) of
null ->
null();
min ->
min();
max ->
max();
{js, Value} ->
js(Value);
{str, Value@1} ->
string(Value@1);
{array, Value@2} ->
array(Value@2);
{double, Value@3} ->
double(Value@3);
{boolean, Value@4} ->
boolean(Value@4);
{integer, Value@5} ->
integer(Value@5);
{document, Value@6} ->
document(Value@6);
{date_time, Value@7} ->
datetime(Value@7);
{object_id, Value@8} ->
object_id(Value@8);
{timestamp, Value@9} ->
timestamp(Value@9);
{binary, {md5, Value@10}} ->
md5(Value@10);
{binary, {uuid, Value@11}} ->
uuid(Value@11);
{binary, {custom, Value@12}} ->
custom(Value@12);
{binary, {generic, Value@13}} ->
generic(Value@13);
{regex, {Pattern, Options}} ->
regex(Pattern, Options)
end,
case Value@14 of
{entity, Kind, Value@15} ->
_pipe = [erlang:element(2, Kind), Key, Value@15],
gleam@bit_string:concat(_pipe)
end.
-spec null() -> entity().
null() ->
{entity, {kind, <<16#0A>>}, <<>>}.
-spec min() -> entity().
min() ->
{entity, {kind, <<16#FF>>}, <<>>}.
-spec max() -> entity().
max() ->
{entity, {kind, <<16#7F>>}, <<>>}.
-spec js(binary()) -> entity().
js(Value) ->
Length = gleam@bit_string:byte_size(<<Value/binary>>) + 1,
{entity, {kind, <<16#0D>>}, <<Length:32/little, Value/binary, 0>>}.
-spec string(binary()) -> entity().
string(Value) ->
Length = gleam@bit_string:byte_size(<<Value/binary>>) + 1,
{entity, {kind, <<16#02>>}, <<Length:32/little, Value/binary, 0>>}.
-spec array(list(bson@types:value())) -> entity().
array(List) ->
case begin
_pipe = List,
_pipe@2 = gleam@list:index_map(
_pipe,
fun(Index, Item) ->
{begin
_pipe@1 = Index,
gleam@int:to_string(_pipe@1)
end,
Item}
end
),
document(_pipe@2)
end of
{entity, _@1, Value} ->
{entity, {kind, <<16#04>>}, Value}
end.
-spec double(float()) -> entity().
double(Value) ->
{entity, {kind, <<16#01>>}, <<Value/little-float>>}.
-spec boolean(boolean()) -> entity().
boolean(Value) ->
case Value of
true ->
{entity, {kind, <<16#08>>}, <<1>>};
false ->
{entity, {kind, <<16#08>>}, <<0>>}
end.
-spec integer(integer()) -> entity().
integer(Value) ->
case (Value < 2147483647) andalso (Value > -2147483648) of
true ->
{entity, {kind, <<16#10>>}, <<Value:32/little>>};
false ->
{entity, {kind, <<16#12>>}, <<Value:64/little>>}
end.
-spec datetime(integer()) -> entity().
datetime(Value) ->
{entity, {kind, <<16#09>>}, <<Value:64/little>>}.
-spec object_id(bson@object_id:object_id()) -> entity().
object_id(Value) ->
{entity,
{kind, <<16#07>>},
begin
_pipe = Value,
bson@object_id:to_bit_string(_pipe)
end}.
-spec timestamp(integer()) -> entity().
timestamp(Value) ->
{entity, {kind, <<16#11>>}, <<Value:64/little>>}.
-spec md5(bson@md5:md5()) -> entity().
md5(Value) ->
Value@1 = begin
_pipe = Value,
bson@md5:to_bit_string(_pipe)
end,
Length = gleam@bit_string:byte_size(Value@1),
{entity,
{kind, <<16#05>>},
begin
_pipe@1 = [<<Length:32/little>>,
erlang:element(2, {sub_kind, <<16#5>>}),
Value@1],
gleam@bit_string:concat(_pipe@1)
end}.
-spec uuid(bson@uuid:uuid()) -> entity().
uuid(Value) ->
Value@1 = begin
_pipe = Value,
bson@uuid:to_bit_string(_pipe)
end,
Length = gleam@bit_string:byte_size(Value@1),
{entity,
{kind, <<16#05>>},
begin
_pipe@1 = [<<Length:32/little>>,
erlang:element(2, {sub_kind, <<16#4>>}),
Value@1],
gleam@bit_string:concat(_pipe@1)
end}.
-spec custom(bson@custom:custom()) -> entity().
custom(Value) ->
{Code, Value@1} = begin
_pipe = Value,
bson@custom:to_bit_string_with_code(_pipe)
end,
Length = gleam@bit_string:byte_size(Value@1),
{entity,
{kind, <<16#05>>},
begin
_pipe@1 = [<<Length:32/little>>, <<Code>>, Value@1],
gleam@bit_string:concat(_pipe@1)
end}.
-spec generic(bson@generic:generic()) -> entity().
generic(Value) ->
Value@1 = begin
_pipe = Value,
bson@generic:to_bit_string(_pipe)
end,
Length = gleam@bit_string:byte_size(Value@1),
{entity,
{kind, <<16#05>>},
begin
_pipe@1 = [<<Length:32/little>>,
erlang:element(2, {sub_kind, <<16#0>>}),
Value@1],
gleam@bit_string:concat(_pipe@1)
end}.
-spec regex(binary(), binary()) -> entity().
regex(Pattern, Options) ->
{entity,
{kind, <<16#0B>>},
begin
_pipe = [<<Pattern/binary, 0, Options/binary, 0>>],
gleam@bit_string:concat(_pipe)
end}.