-module(internal@props). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/internal/props.gleam"). -export([page_object_to_json/2]). -export_type([page_prop/0, render_context/0, page_object/0]). -type page_prop() :: {error_prop, binary(), gleam@json:json()} | {base_prop, binary(), gleam@json:json()} | {once_prop, binary(), fun(() -> gleam@json:json())} | {shared_prop, binary(), gleam@json:json()} | {defer_prop, binary(), fun(() -> {ok, gleam@json:json()} | {error, nil}), gleam@option:option(binary())}. -type render_context() :: {render_context, binary(), binary(), boolean(), list(binary()), list(binary())}. -type page_object() :: {page_object, binary(), binary(), list(page_prop()), list(page_prop()), list(page_prop()), binary(), gleam@option:option(boolean())}. -file("src/internal/props.gleam", 117). -spec resolve_defer_prop(list(page_prop())) -> gleam@option:option({binary(), gleam@json:json()}). resolve_defer_prop(Props) -> Groups = begin _pipe = Props, gleam@list:group(_pipe, fun(P) -> case P of {defer_prop, _, _, G} -> gleam@option:unwrap(G, <<"default"/utf8>>); _ -> <<""/utf8>> end end) end, Items = begin _pipe@1 = maps:keys(Groups), _pipe@2 = gleam@list:filter(_pipe@1, fun(Key) -> Key /= <<""/utf8>> end), gleam@list:map( _pipe@2, fun(K) -> Values = begin _pipe@3 = gleam_stdlib:map_get(Groups, K), _pipe@4 = gleam@result:unwrap(_pipe@3, []), gleam@list:map( _pipe@4, fun(P@1) -> erlang:element(2, P@1) end ) end, {K, gleam@json:array(Values, fun gleam@json:string/1)} end ) end, case Items of [] -> none; _ -> {some, {<<"deferredProps"/utf8>>, gleam@json:object(Items)}} end. -file("src/internal/props.gleam", 91). -spec resolve_once_props(list(page_prop())) -> gleam@option:option({binary(), gleam@json:json()}). resolve_once_props(Props) -> Once = begin _pipe = Props, _pipe@1 = gleam@list:filter(_pipe, fun(P) -> case P of {once_prop, _, _} -> true; _ -> false end end), gleam@list:map( _pipe@1, fun(P@1) -> Value = gleam@json:object( [{<<"prop"/utf8>>, gleam@json:string(erlang:element(2, P@1))}, {<<"expiresAt"/utf8>>, gleam@json:null()}] ), {erlang:element(2, P@1), Value} end ) end, case Once of [] -> none; _ -> {some, {<<"onceProps"/utf8>>, gleam@json:object(Once)}} end. -file("src/internal/props.gleam", 146). -spec resolve_map_prop(page_prop()) -> {binary(), gleam@json:json()}. resolve_map_prop(P) -> case P of {once_prop, Name, Fun} -> {Name, Fun()}; {base_prop, Name@1, Value} -> {Name@1, Value}; {shared_prop, Name@2, Value@1} -> {Name@2, Value@1}; {defer_prop, Name@3, Fun@1, _} -> case Fun@1() of {ok, Val} -> {Name@3, Val}; _ -> {Name@3, gleam@json:null()} end; {error_prop, Name@4, Value@2} -> {<<"errors"/utf8>>, gleam@json:object([{Name@4, Value@2}])} end. -file("src/internal/props.gleam", 79). -spec resolve_props(render_context(), list(page_prop())) -> list({binary(), gleam@json:json()}). resolve_props(Ctx, Props) -> _pipe = gleam@list:filter( Props, fun(P) -> Include = gleam@list:contains( erlang:element(5, Ctx), erlang:element(2, P) ), Exclude = gleam@list:contains( erlang:element(6, Ctx), erlang:element(2, P) ), Include orelse not Exclude end ), gleam@list:map(_pipe, fun resolve_map_prop/1). -file("src/internal/props.gleam", 41). -spec page_object_to_json(page_object(), render_context()) -> gleam@json:json(). page_object_to_json(Po, Ctx) -> Default_props = begin _pipe = resolve_props(Ctx, erlang:element(4, Po)), lists:append( _pipe, [{<<"errors"/utf8>>, gleam@json:object(resolve_props(Ctx, erlang:element(5, Po)))}] ) end, View_props = case erlang:element(4, Ctx) of true -> _pipe@1 = Default_props, gleam@json:object(_pipe@1); false -> _pipe@2 = Default_props, _pipe@3 = lists:append( _pipe@2, resolve_props(Ctx, erlang:element(6, Po)) ), gleam@json:object(_pipe@3) end, Base_items = [{<<"component"/utf8>>, gleam@json:string(erlang:element(2, Po))}, {<<"url"/utf8>>, gleam@json:string(erlang:element(3, Po))}, {<<"props"/utf8>>, View_props}, {<<"version"/utf8>>, gleam@json:string(erlang:element(7, Po))}, {<<"clearHistory"/utf8>>, gleam@json:bool(false)}], Once_resolved = case resolve_once_props(erlang:element(4, Po)) of none -> Base_items; {some, Once} -> lists:append(Base_items, [Once]) end, Defer_resolved = case erlang:element(4, Ctx) of false -> Once_resolved; true -> case resolve_defer_prop(erlang:element(6, Po)) of none -> Once_resolved; {some, Defers} -> lists:append(Once_resolved, [Defers]) end end, gleam@json:object(Defer_resolved).