Current section
Files
Jump to
Current section
Files
src/sprocket@internal@render@json.erl
-module(sprocket@internal@render@json).
-compile([no_auto_import, nowarn_unused_vars]).
-export([renderer/0]).
-spec text(binary()) -> gleam@json:json().
text(T) ->
gleam@json:string(T).
-spec element(
binary(),
gleam@option:option(binary()),
list(sprocket@render:rendered_attribute()),
list(sprocket@render:rendered_element())
) -> gleam@json:json().
element(Tag, Key, Attrs, Children) ->
Attrs@1 = begin
_pipe = Attrs,
gleam@list:flat_map(_pipe, fun(Attr) -> case Attr of
{rendered_attribute, Name, Value} ->
[{Name, gleam@json:string(Value)}];
{rendered_event_handler, Kind, Id} ->
[{gleam@string:concat(
[sprocket@internal@constants:constant(
event_attr_prefix
),
<<"-"/utf8>>,
Kind]
),
gleam@json:string(Id)}];
{rendered_client_hook, Name@1, Id@1} ->
[{gleam@string:concat(
[sprocket@internal@constants:constant(
client_hook_attr_prefix
)]
),
gleam@json:string(Name@1)},
{gleam@string:concat(
[sprocket@internal@constants:constant(
client_hook_attr_prefix
),
<<"-id"/utf8>>]
),
gleam@json:string(Id@1)}]
end end)
end,
Attrs@2 = case Key of
{some, K} ->
gleam@list:append(
Attrs@1,
[{sprocket@internal@constants:constant(key_attr),
gleam@json:string(K)}]
);
none ->
Attrs@1
end,
Children@1 = begin
_pipe@1 = Children,
gleam@list:index_map(
_pipe@1,
fun(I, Child) -> {gleam@int:to_string(I), render(Child)} end
)
end,
_pipe@2 = [{<<"type"/utf8>>, gleam@json:string(Tag)},
{<<"attrs"/utf8>>, gleam@json:object(Attrs@2)}],
_pipe@3 = gleam@list:append(_pipe@2, Children@1),
gleam@json:object(_pipe@3).
-spec render(sprocket@render:rendered_element()) -> gleam@json:json().
render(El) ->
case El of
{rendered_element, Tag, Key, Attrs, Children} ->
element(Tag, Key, Attrs, Children);
{rendered_component, _, _, _, _, Children@1} ->
component(Children@1);
{rendered_text, T} ->
text(T)
end.
-spec renderer() -> sprocket@render:renderer(gleam@json:json()).
renderer() ->
{renderer, fun(El) -> render(El) end}.
-spec component(list(sprocket@render:rendered_element())) -> gleam@json:json().
component(Children) ->
Children@1 = begin
_pipe = Children,
gleam@list:index_map(
_pipe,
fun(I, Child) -> {gleam@int:to_string(I), render(Child)} end
)
end,
_pipe@1 = [{<<"type"/utf8>>, gleam@json:string(<<"component"/utf8>>)}],
_pipe@2 = gleam@list:append(_pipe@1, Children@1),
gleam@json:object(_pipe@2).