Current section

Files

Jump to
sprocket src sprocket@internal@render@json.erl
Raw

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: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)}
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).