Current section

Files

Jump to
wisp_inertia src internal@props.erl
Raw

src/internal@props.erl

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