Current section
Files
Jump to
Current section
Files
src/postgleam@codec@registry.erl
-module(postgleam@codec@registry).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/postgleam/codec/registry.gleam").
-export([build/1, find_by_send/2, register/3, lookup/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-file("src/postgleam/codec/registry.gleam", 30).
-spec register_oids(
list(integer()),
fun((integer()) -> postgleam@codec:codec()),
gleam@dict:dict(integer(), postgleam@codec:codec())
) -> gleam@dict:dict(integer(), postgleam@codec:codec()).
register_oids(Oids, Build, Acc) ->
case Oids of
[] ->
Acc;
[Oid | Rest] ->
Codec = Build(Oid),
register_oids(Rest, Build, gleam@dict:insert(Acc, Oid, Codec))
end.
-file("src/postgleam/codec/registry.gleam", 17).
-spec build_loop(
list(postgleam@codec:codec_matcher()),
gleam@dict:dict(integer(), postgleam@codec:codec())
) -> gleam@dict:dict(integer(), postgleam@codec:codec()).
build_loop(Matchers, Acc) ->
case Matchers of
[] ->
Acc;
[Matcher | Rest] ->
Acc@1 = register_oids(
erlang:element(3, Matcher),
erlang:element(6, Matcher),
Acc
),
build_loop(Rest, Acc@1)
end.
-file("src/postgleam/codec/registry.gleam", 13).
?DOC(" Build a registry from a list of matchers and known OIDs\n").
-spec build(list(postgleam@codec:codec_matcher())) -> gleam@dict:dict(integer(), postgleam@codec:codec()).
build(Matchers) ->
build_loop(Matchers, maps:new()).
-file("src/postgleam/codec/registry.gleam", 53).
?DOC(" Find a codec matcher by send function name\n").
-spec find_by_send(list(postgleam@codec:codec_matcher()), binary()) -> {ok,
postgleam@codec:codec_matcher()} |
{error, nil}.
find_by_send(Matchers, Send_fn) ->
case Matchers of
[] ->
{error, nil};
[Matcher | Rest] ->
case erlang:element(4, Matcher) of
{some, S} when S =:= Send_fn ->
{ok, Matcher};
_ ->
find_by_send(Rest, Send_fn)
end
end.
-file("src/postgleam/codec/registry.gleam", 68).
?DOC(" Register a single OID with a specific matcher's build function\n").
-spec register(
gleam@dict:dict(integer(), postgleam@codec:codec()),
integer(),
postgleam@codec:codec_matcher()
) -> gleam@dict:dict(integer(), postgleam@codec:codec()).
register(Registry, Oid, Matcher) ->
Codec = (erlang:element(6, Matcher))(Oid),
gleam@dict:insert(Registry, Oid, Codec).
-file("src/postgleam/codec/registry.gleam", 45).
?DOC(" Look up a codec by OID\n").
-spec lookup(gleam@dict:dict(integer(), postgleam@codec:codec()), integer()) -> {ok,
postgleam@codec:codec()} |
{error, binary()}.
lookup(Registry, Oid) ->
case gleam_stdlib:map_get(Registry, Oid) of
{ok, Codec} ->
{ok, Codec};
{error, _} ->
{error,
<<"No codec registered for OID "/utf8,
(erlang:integer_to_binary(Oid))/binary>>}
end.