Current section

Files

Jump to
sprocket src sprocket@json.erl
Raw

src/sprocket@json.erl

-module(sprocket@json).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([client_message_decoder/0, encode_runtime_message/1]).
-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/sprocket/json.gleam", 25).
?DOC(" Decoder for inbound client hook events.\n").
-spec inbound_client_hook_event_decoder() -> gleam@dynamic@decode:decoder(sprocket@runtime:client_message()).
inbound_client_hook_event_decoder() ->
gleam@dynamic@decode:field(
<<"id"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Element_id) ->
gleam@dynamic@decode:field(
<<"hook"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Hook) ->
gleam@dynamic@decode:field(
<<"kind"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Kind) ->
gleam@dynamic@decode:optional_field(
<<"payload"/utf8>>,
gleam_stdlib:identity(nil),
{decoder,
fun gleam@dynamic@decode:decode_dynamic/1},
fun(Payload) ->
gleam@dynamic@decode:success(
{inbound_client_hook_event,
Element_id,
Hook,
Kind,
Payload}
)
end
)
end
)
end
)
end
).
-file("src/sprocket/json.gleam", 38).
-spec client_event_decoder() -> gleam@dynamic@decode:decoder(sprocket@runtime:client_message()).
client_event_decoder() ->
gleam@dynamic@decode:field(
<<"id"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Element_id) ->
gleam@dynamic@decode:field(
<<"kind"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Kind) ->
gleam@dynamic@decode:optional_field(
<<"payload"/utf8>>,
gleam_stdlib:identity(nil),
{decoder, fun gleam@dynamic@decode:decode_dynamic/1},
fun(Payload) ->
gleam@dynamic@decode:success(
{client_event, Element_id, Kind, Payload}
)
end
)
end
)
end
).
-file("src/sprocket/json.gleam", 15).
?DOC(" Decoder for client messages.\n").
-spec client_message_decoder() -> gleam@dynamic@decode:decoder(sprocket@runtime:client_message()).
client_message_decoder() ->
gleam@dynamic@decode:then(
gleam@dynamic@decode:at(
[0],
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
fun(Message_type) -> case Message_type of
<<"hook"/utf8>> ->
gleam@dynamic@decode:at(
[1],
inbound_client_hook_event_decoder()
);
_ ->
gleam@dynamic@decode:at([1], client_event_decoder())
end end
).
-file("src/sprocket/json.gleam", 94).
-spec payload_decoder() -> gleam@dynamic@decode:decoder(gleam@json:json()).
payload_decoder() ->
gleam@dynamic@decode:recursive(
fun() ->
gleam@dynamic@decode:one_of(
begin
_pipe = {decoder, fun gleam@dynamic@decode:decode_string/1},
gleam@dynamic@decode:map(_pipe, fun gleam@json:string/1)
end,
[begin
_pipe@1 = {decoder,
fun gleam@dynamic@decode:decode_int/1},
gleam@dynamic@decode:map(_pipe@1, fun gleam@json:int/1)
end,
begin
_pipe@2 = {decoder,
fun gleam@dynamic@decode:decode_float/1},
gleam@dynamic@decode:map(
_pipe@2,
fun gleam@json:float/1
)
end,
begin
_pipe@3 = {decoder,
fun gleam@dynamic@decode:decode_bool/1},
gleam@dynamic@decode:map(_pipe@3, fun gleam@json:bool/1)
end,
begin
_pipe@4 = gleam@dynamic@decode:list(payload_decoder()),
gleam@dynamic@decode:map(
_pipe@4,
fun gleam@json:preprocessed_array/1
)
end,
begin
_pipe@5 = gleam@dynamic@decode:dict(
{decoder, fun gleam@dynamic@decode:decode_string/1},
payload_decoder()
),
gleam@dynamic@decode:map(_pipe@5, fun(D) -> _pipe@6 = D,
_pipe@7 = maps:to_list(_pipe@6),
gleam@json:object(_pipe@7) end)
end]
)
end
).
-file("src/sprocket/json.gleam", 90).
-spec encode_payload(gleam@dynamic:dynamic_()) -> {ok, gleam@json:json()} |
{error, list(gleam@dynamic@decode:decode_error())}.
encode_payload(Payload) ->
gleam@dynamic@decode:run(Payload, payload_decoder()).
-file("src/sprocket/json.gleam", 51).
?DOC(" Encodes a runtime message as JSON.\n").
-spec encode_runtime_message(sprocket@runtime:runtime_message()) -> gleam@json:json().
encode_runtime_message(Event) ->
case Event of
{full_update, Update} ->
sprocket@render:renderer(
sprocket@renderers@json:json_renderer(),
fun(Render_json) ->
gleam@json:preprocessed_array(
[gleam@json:string(<<"ok"/utf8>>), Render_json(Update)]
)
end
);
{patch_update, P} ->
gleam@json:preprocessed_array(
[gleam@json:string(<<"update"/utf8>>),
sprocket@internal@patch:patch_to_json(P)]
);
{outbound_client_hook_event, Id, Hook, Kind, Payload} ->
Payload_json = begin
_pipe = Payload,
_pipe@1 = gleam@option:map(_pipe, fun encode_payload/1),
_pipe@2 = gleam@option:map(
_pipe@1,
fun gleam@option:from_result/1
),
gleam@option:flatten(_pipe@2)
end,
gleam@json:preprocessed_array(
[gleam@json:string(<<"hook"/utf8>>), case Payload_json of
{some, Payload_json@1} ->
gleam@json:object(
[{<<"id"/utf8>>, gleam@json:string(Id)},
{<<"hook"/utf8>>, gleam@json:string(Hook)},
{<<"kind"/utf8>>, gleam@json:string(Kind)},
{<<"payload"/utf8>>, Payload_json@1}]
);
none ->
gleam@json:object(
[{<<"id"/utf8>>, gleam@json:string(Id)},
{<<"hook"/utf8>>, gleam@json:string(Hook)},
{<<"kind"/utf8>>, gleam@json:string(Kind)}]
)
end]
)
end.