Current section
Files
Jump to
Current section
Files
src/formz@formz_use.erl
-module(formz@formz_use).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([create_form/1, with/3, with_form/3, data/2, parse/1, parse_then_try/2, items/1, get/2, update/3, update_field/3, update_subform/3]).
-export_type([form/2, form_item/1]).
-opaque form(GTD, GTE) :: {form,
list(form_item(GTD)),
fun((list(form_item(GTD))) -> {ok, GTE} | {error, list(form_item(GTD))}),
GTE}.
-type form_item(GTF) :: {element,
formz@field:field(),
fun((formz@field:field(), formz@widget:args()) -> GTF)} |
{set, formz@form_details:form_details(), list(form_item(GTF))}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 22).
-spec create_form(GTG) -> form(any(), GTG).
create_form(Thing) ->
{form, [], fun(_) -> {ok, Thing} end, Thing}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 136).
-spec pop_element(list(form_item(GUC))) -> {ok,
{form_item(GUC), list(form_item(GUC))}} |
{error, nil}.
pop_element(Items) ->
case Items of
[] ->
{error, nil};
[Only] ->
{ok, {Only, []}};
[{element, _, _} = Item | Rest] ->
{ok, {Item, Rest}};
[{set, _, []} | Rest@1] ->
pop_element(Rest@1);
[{set, S, [First | Rest_1]} | Rest_2] ->
pop_element(
gleam@list:flatten([[First], [{set, S, Rest_1}], Rest_2])
)
end.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 26).
-spec with(
formz@field:field(),
formz@definition:definition(GTK, GTL),
fun((GTL) -> form(GTK, GTO))
) -> form(GTK, GTO).
with(Field, Definition, Fun) ->
Next_form = Fun(erlang:element(4, Definition)),
Updated_items = [{element, Field, erlang:element(2, Definition)} |
erlang:element(2, Next_form)],
Parse = fun(Items) ->
_assert_subject = pop_element(Items),
{ok, {{element, Field@1, Widget}, Pop_elements}} = case _assert_subject of
{ok, {{element, _, _}, _}} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"formz/formz_use"/utf8>>,
function => <<"with"/utf8>>,
line => 45})
end,
Input_output = (erlang:element(3, Definition))(
erlang:element(8, Field@1)
),
Next_form@1 = Fun(
begin
_pipe = Input_output,
gleam@result:unwrap(_pipe, erlang:element(4, Definition))
end
),
Form_output = (erlang:element(3, Next_form@1))(Pop_elements),
case {Form_output, Input_output} of
{{ok, _}, {ok, _}} ->
Form_output;
{{error, Items@1}, {ok, _}} ->
{error, [{element, Field@1, Widget} | Items@1]};
{{ok, _}, {error, Error}} ->
_pipe@1 = Field@1,
_pipe@2 = formz@field:set_error(_pipe@1, Error),
_pipe@3 = {element, _pipe@2, Widget},
_pipe@4 = gleam@list:prepend(Pop_elements, _pipe@3),
{error, _pipe@4};
{{error, Items@2}, {error, Error@1}} ->
_pipe@5 = Field@1,
_pipe@6 = formz@field:set_error(_pipe@5, Error@1),
_pipe@7 = {element, _pipe@6, Widget},
_pipe@8 = gleam@list:prepend(Items@2, _pipe@7),
{error, _pipe@8}
end
end,
{form, Updated_items, Parse, erlang:element(4, Next_form)}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 149).
-spec map_fields(
list(form_item(GUK)),
fun((formz@field:field()) -> formz@field:field())
) -> list(form_item(GUK)).
map_fields(Items, Fun) ->
gleam@list:map(Items, fun(Item) -> case Item of
{element, Field, Widget} ->
{element, Fun(Field), Widget};
{set, S, Items@1} ->
{set, S, map_fields(Items@1, Fun)}
end end).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 89).
-spec with_form(
formz@form_details:form_details(),
form(GTT, GTU),
fun((GTU) -> form(GTT, GTX))
) -> form(GTT, GTX).
with_form(Details, Sub, Fun) ->
Next_form = Fun(erlang:element(4, Sub)),
Sub_items = begin
_pipe = erlang:element(2, Sub),
map_fields(_pipe, fun(Field) -> _pipe@1 = Field,
formz@field:set_name(
_pipe@1,
<<<<(erlang:element(2, Details))/binary, "."/utf8>>/binary,
(erlang:element(2, Field))/binary>>
) end)
end,
Updated_items = [{set, Details, Sub_items} | erlang:element(2, Next_form)],
Parse = fun(Items) ->
[{set, Details@1, Sub_items@1} | Next_items] = case Items of
[{set, _, _} | _] -> Items;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"formz/formz_use"/utf8>>,
function => <<"with_form"/utf8>>,
line => 106})
end,
Sub_output = (erlang:element(3, Sub))(Sub_items@1),
Next_form@1 = Fun(
begin
_pipe@2 = Sub_output,
gleam@result:unwrap(_pipe@2, erlang:element(4, Sub))
end
),
Form_output = (erlang:element(3, Next_form@1))(Next_items),
case {Form_output, Sub_output} of
{{ok, _}, {ok, _}} ->
Form_output;
{{error, Items@1}, {ok, _}} ->
{error, [{set, Details@1, Items@1} | Items@1]};
{{ok, _}, {error, Error_fields}} ->
{error, [{set, Details@1, Error_fields} | Next_items]};
{{error, Fields}, {error, Error_fields@1}} ->
{error,
gleam@list:prepend(Fields, {set, Details@1, Error_fields@1})}
end
end,
{form, Updated_items, Parse, erlang:element(4, Next_form)}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 161).
-spec data(form(GUP, GUQ), list({binary(), binary()})) -> form(GUP, GUQ).
data(Form, Input_data) ->
Data = maps:from_list(Input_data),
{form, Items, Parse, Placeholder} = Form,
_pipe = Items,
_pipe@1 = map_fields(
_pipe,
fun(Field) -> case gleam@dict:get(Data, erlang:element(2, Field)) of
{ok, Value} ->
formz@field:set_string_value(Field, Value);
{error, _} ->
Field
end end
),
{form, _pipe@1, Parse, Placeholder}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 177).
-spec parse(form(GUW, GUX)) -> {ok, GUX} | {error, form(GUW, GUX)}.
parse(Form) ->
case (erlang:element(3, Form))(erlang:element(2, Form)) of
{ok, Output} ->
{ok, Output};
{error, Items} ->
{error, erlang:setelement(2, Form, Items)}
end.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 184).
-spec parse_then_try(
form(GVE, GVF),
fun((form(GVE, GVF), GVF) -> {ok, GVK} | {error, form(GVE, GVF)})
) -> {ok, GVK} | {error, form(GVE, GVF)}.
parse_then_try(Form, Fun) ->
_pipe = parse(Form),
gleam@result:'try'(_pipe, fun(_capture) -> Fun(Form, _capture) end).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 191).
-spec items(form(GVT, any())) -> list(form_item(GVT)).
items(Form) ->
erlang:element(2, Form).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 195).
-spec get(form(GVZ, any()), binary()) -> {ok, form_item(GVZ)} | {error, nil}.
get(Form, Name) ->
_pipe = erlang:element(2, Form),
_pipe@1 = gleam@list:filter(_pipe, fun(Item) -> case Item of
{element, I, _} when erlang:element(2, I) =:= Name ->
true;
{set, S, _} when erlang:element(2, S) =:= Name ->
true;
_ ->
false
end end),
gleam@list:first(_pipe@1).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 220).
-spec do_formitem_update(
list(form_item(GWN)),
binary(),
fun((form_item(GWN)) -> form_item(GWN))
) -> list(form_item(GWN)).
do_formitem_update(Items, Name, Fun) ->
_pipe = Items,
gleam@list:map(_pipe, fun(Item) -> case Item of
{element, I, _} when erlang:element(2, I) =:= Name ->
Fun(Item);
{set, S, _} when erlang:element(2, S) =:= Name ->
Fun(Item);
{set, S@1, Items@1} ->
{set, S@1, do_formitem_update(Items@1, Name, Fun)};
_ ->
Item
end end).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 210).
-spec update(form(GWG, GWH), binary(), fun((form_item(GWG)) -> form_item(GWG))) -> form(GWG, GWH).
update(Form, Name, Fun) ->
_pipe = erlang:element(2, Form),
_pipe@1 = do_formitem_update(_pipe, Name, Fun),
{form, _pipe@1, erlang:element(3, Form), erlang:element(4, Form)}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 236).
-spec update_field(
form(GWU, GWV),
binary(),
fun((formz@field:field()) -> formz@field:field())
) -> form(GWU, GWV).
update_field(Form, Name, Fun) ->
update(Form, Name, fun(Item) -> case Item of
{element, Field, Widget} ->
{element, Fun(Field), Widget};
_ ->
Item
end end).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 249).
-spec update_subform(
form(GXA, GXB),
binary(),
fun((formz@form_details:form_details()) -> formz@form_details:form_details())
) -> form(GXA, GXB).
update_subform(Form, Name, Fun) ->
update(Form, Name, fun(Item) -> case Item of
{set, Details, Items} ->
{set, Fun(Details), Items};
_ ->
Item
end end).