Current section

Files

Jump to
glats src glats@internal@decoder.erl
Raw

src/glats@internal@decoder.erl

-module(glats@internal@decoder).
-compile([no_auto_import, nowarn_unused_vars]).
-export([headers/1, reply_to/1, decode_msg/1, decode_mandatory_server_info/1, decode_optional_server_info/1, decode_server_info/1]).
-export_type([mandatory_fields/0, optional_fields/0]).
-type mandatory_fields() :: {mandatory_fields,
binary(),
binary(),
binary(),
binary(),
binary(),
integer(),
boolean(),
integer(),
integer()}.
-type optional_fields() :: {optional_fields,
boolean(),
gleam@option:option(boolean())}.
-spec atom_field(
binary(),
fun((gleam@dynamic:dynamic()) -> {ok, GGF} |
{error, list(gleam@dynamic:decode_error())})
) -> fun((gleam@dynamic:dynamic()) -> {ok, GGF} |
{error, list(gleam@dynamic:decode_error())}).
atom_field(Key, Value) ->
gleam@dynamic:field(erlang:binary_to_atom(Key), Value).
-spec headers(gleam@dynamic:dynamic()) -> {ok,
gleam@map:map_(binary(), binary())} |
{error, list(gleam@dynamic:decode_error())}.
headers(Data) ->
_pipe = Data,
_pipe@1 = (atom_field(
<<"headers"/utf8>>,
gleam@dynamic:list(
gleam@dynamic:tuple2(
fun gleam@dynamic:string/1,
fun gleam@dynamic:string/1
)
)
))(_pipe),
_pipe@2 = gleam@result:map(_pipe@1, fun gleam@map:from_list/1),
gleam@result:'or'(_pipe@2, {ok, gleam@map:new()}).
-spec reply_to(gleam@dynamic:dynamic()) -> {ok, gleam@option:option(binary())} |
{error, list(gleam@dynamic:decode_error())}.
reply_to(Data) ->
_pipe = Data,
_pipe@1 = (gleam@dynamic:optional(
atom_field(<<"reply_to"/utf8>>, fun gleam@dynamic:string/1)
))(_pipe),
gleam@result:'or'(_pipe@1, {ok, none}).
-spec decode_msg(gleam@dynamic:dynamic()) -> {ok, glats@message:message()} |
{error, list(gleam@dynamic:decode_error())}.
decode_msg(Data) ->
_pipe = Data,
(gleam@dynamic:decode4(
fun(Field@0, Field@1, Field@2, Field@3) -> {message, Field@0, Field@1, Field@2, Field@3} end,
atom_field(<<"topic"/utf8>>, fun gleam@dynamic:string/1),
fun headers/1,
fun reply_to/1,
atom_field(<<"body"/utf8>>, fun gleam@dynamic:string/1)
))(_pipe).
-spec decode_mandatory_server_info(gleam@dynamic:dynamic()) -> {ok,
mandatory_fields()} |
{error, list(gleam@dynamic:decode_error())}.
decode_mandatory_server_info(Data) ->
_pipe = Data,
(gleam@dynamic:decode9(
fun(Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6, Field@7, Field@8) -> {mandatory_fields, Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6, Field@7, Field@8} end,
atom_field(<<"server_id"/utf8>>, fun gleam@dynamic:string/1),
atom_field(<<"server_name"/utf8>>, fun gleam@dynamic:string/1),
atom_field(<<"version"/utf8>>, fun gleam@dynamic:string/1),
atom_field(<<"go"/utf8>>, fun gleam@dynamic:string/1),
atom_field(<<"host"/utf8>>, fun gleam@dynamic:string/1),
atom_field(<<"port"/utf8>>, fun gleam@dynamic:int/1),
atom_field(<<"headers"/utf8>>, fun gleam@dynamic:bool/1),
atom_field(<<"max_payload"/utf8>>, fun gleam@dynamic:int/1),
atom_field(<<"proto"/utf8>>, fun gleam@dynamic:int/1)
))(_pipe).
-spec jetstream(gleam@dynamic:dynamic()) -> {ok, boolean()} |
{error, list(gleam@dynamic:decode_error())}.
jetstream(Data) ->
_pipe = Data,
_pipe@1 = (atom_field(<<"jetstream"/utf8>>, fun gleam@dynamic:bool/1))(
_pipe
),
gleam@result:'or'(_pipe@1, {ok, false}).
-spec optional_field(
binary(),
fun((gleam@dynamic:dynamic()) -> {ok, GIO} |
{error, list(gleam@dynamic:decode_error())})
) -> fun((gleam@dynamic:dynamic()) -> {ok, gleam@option:option(GIO)} |
{error, list(gleam@dynamic:decode_error())}).
optional_field(Key, Value) ->
fun(Data) ->
_pipe = Data,
_pipe@1 = (gleam@dynamic:optional(atom_field(Key, Value)))(_pipe),
gleam@result:'or'(_pipe@1, {ok, none})
end.
-spec decode_optional_server_info(gleam@dynamic:dynamic()) -> {ok,
optional_fields()} |
{error, list(gleam@dynamic:decode_error())}.
decode_optional_server_info(Data) ->
_pipe = Data,
(gleam@dynamic:decode2(
fun(Field@0, Field@1) -> {optional_fields, Field@0, Field@1} end,
fun jetstream/1,
optional_field(<<"auth_required"/utf8>>, fun gleam@dynamic:bool/1)
))(_pipe).
-spec decode_server_info(gleam@dynamic:dynamic()) -> {ok,
glats@protocol:server_info()} |
{error, list(gleam@dynamic:decode_error())}.
decode_server_info(Data) ->
gleam@result:then(
decode_mandatory_server_info(Data),
fun(Mandatory) ->
gleam@result:then(
decode_optional_server_info(Data),
fun(Optional) ->
{ok,
{server_info,
erlang:element(2, Mandatory),
erlang:element(3, Mandatory),
erlang:element(4, Mandatory),
erlang:element(5, Mandatory),
erlang:element(6, Mandatory),
erlang:element(7, Mandatory),
erlang:element(8, Mandatory),
erlang:element(9, Mandatory),
erlang:element(10, Mandatory),
erlang:element(2, Optional),
erlang:element(3, Optional)}}
end
)
end
).