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