Current section

Files

Jump to
formz src formz.erl
Raw

src/formz.erl

-module(formz).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([create_form/1, optional/3, require/3, get_fields/1, subform/3, data/2, parse/1, parse_then_try/2, items/1, get/2, validate/2, validate_all/1, update/3, update_field/3, update_subform/3]).
-export_type([form/2, form_item/1]).
-opaque form(GBW, GBX) :: {form,
list(form_item(GBW)),
fun((list(form_item(GBW))) -> {ok, GBX} | {error, list(form_item(GBW))}),
GBX}.
-type form_item(GBY) :: {field, formz@field:field(), GBY} |
{sub_form, formz@subform:sub_form(), list(form_item(GBY))}.
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 93).
-spec create_form(GBZ) -> form(any(), GBZ).
create_form(Thing) ->
{form, [], fun(_) -> {ok, Thing} end, Thing}.
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 277).
-spec pop_field(list(form_item(GDR))) -> {ok,
{form_item(GDR), list(form_item(GDR))}} |
{error, nil}.
pop_field(Items) ->
case Items of
[] ->
{error, nil};
[Only] ->
{ok, {Only, []}};
[{field, _, _} = Item | Rest] ->
{ok, {Item, Rest}};
[{sub_form, _, []} | Rest@1] ->
pop_field(Rest@1);
[{sub_form, S, [First | Rest_1]} | Rest_2] ->
pop_field(
gleam@list:flatten([[First], [{sub_form, S, Rest_1}], Rest_2])
)
end.
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 97).
-spec add(
formz@field:field(),
GCD,
fun((binary()) -> {ok, GCE} | {error, binary()}),
GCE,
fun((GCE) -> form(GCD, GCH))
) -> form(GCD, GCH).
add(Field, Widget, Parse_field, Stub, Fun) ->
Next_form = Fun(Stub),
Updated_items = [{field, Field, Widget} | erlang:element(2, Next_form)],
Parse = fun(Items) ->
_assert_subject = pop_field(Items),
{ok, {{field, Field@1, Widget@1}, Next_items}} = case _assert_subject of
{ok, {{field, _, _}, _}} -> _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"/utf8>>,
function => <<"add"/utf8>>,
line => 118})
end,
Input_output = Parse_field(erlang:element(8, Field@1)),
Next_form@1 = Fun(
begin
_pipe = Input_output,
gleam@result:unwrap(_pipe, Stub)
end
),
Form_output = (erlang:element(3, Next_form@1))(Next_items),
case {Form_output, Input_output} of
{{ok, _}, {ok, _}} ->
Form_output;
{{error, Error_items}, {ok, _}} ->
F = {field, Field@1, Widget@1},
{error, [F | Error_items]};
{{ok, _}, {error, Error}} ->
F@1 = {field, formz@field:set_error(Field@1, Error), Widget@1},
{error, [F@1 | Next_items]};
{{error, Error_items@1}, {error, Error@1}} ->
F@2 = {field, formz@field:set_error(Field@1, Error@1), Widget@1},
{error, [F@2 | Error_items@1]}
end
end,
{form, Updated_items, Parse, erlang:element(4, Next_form)}.
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 174).
-spec optional(
formz@field:field(),
formz@definition:definition(GCM, any(), GCO),
fun((GCO) -> form(GCM, GCS))
) -> form(GCM, GCS).
optional(Field, Definition, Fun) ->
add(
begin
_pipe = Field,
formz@field:set_required(_pipe, false)
end,
erlang:element(2, Definition),
fun(_capture) ->
(erlang:element(5, Definition))(
erlang:element(3, Definition),
_capture
)
end,
erlang:element(6, Definition),
Fun
).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 204).
-spec require(
formz@field:field(),
formz@definition:definition(GCX, GCY, any()),
fun((GCY) -> form(GCX, GDD))
) -> form(GCX, GDD).
require(Field, Definition, Fun) ->
add(
begin
_pipe = Field,
formz@field:set_required(_pipe, true)
end,
erlang:element(2, Definition),
erlang:element(3, Definition),
erlang:element(4, Definition),
Fun
).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 295).
-spec do_get_fields(list(form_item(any()))) -> list(formz@field:field()).
do_get_fields(Items) ->
_pipe = gleam@list:fold(Items, [], fun(Acc, Item) -> case Item of
{field, F, _} ->
[F | Acc];
{sub_form, _, Sub_items} ->
gleam@list:flatten([do_get_fields(Sub_items), Acc])
end end),
lists:reverse(_pipe).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 291).
-spec get_fields(form(any(), any())) -> list(formz@field:field()).
get_fields(Form) ->
_pipe = erlang:element(2, Form),
do_get_fields(_pipe).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 305).
-spec update_fields(
list(form_item(GEI)),
fun((formz@field:field()) -> formz@field:field())
) -> list(form_item(GEI)).
update_fields(Items, Fun) ->
gleam@list:map(Items, fun(Item) -> case Item of
{field, Field, Widget} ->
{field, Fun(Field), Widget};
{sub_form, S, Items@1} ->
{sub_form, S, update_fields(Items@1, Fun)}
end end).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 229).
-spec subform(
formz@subform:sub_form(),
form(GDI, GDJ),
fun((GDJ) -> form(GDI, GDM))
) -> form(GDI, GDM).
subform(Details, Sub, Fun) ->
Next_form = Fun(erlang:element(4, Sub)),
Sub_items = begin
_pipe = erlang:element(2, Sub),
update_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 = [{sub_form, Details, Sub_items} |
erlang:element(2, Next_form)],
Parse = fun(Items) ->
[{sub_form, Details@1, Sub_items@1} | Next_items] = case Items of
[{sub_form, _, _} | _] -> Items;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"formz"/utf8>>,
function => <<"subform"/utf8>>,
line => 246})
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, Next_error_items}, {ok, _}} ->
{error, [{sub_form, Details@1, Sub_items@1} | Next_error_items]};
{{ok, _}, {error, Error_items}} ->
{error, [{sub_form, Details@1, Error_items} | Next_items]};
{{error, Next_error_items@1}, {error, Error_items@1}} ->
{error,
[{sub_form, Details@1, Error_items@1} | Next_error_items@1]}
end
end,
{form, Updated_items, Parse, erlang:element(4, Next_form)}.
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 326).
-spec data(form(GEN, GEO), list({binary(), binary()})) -> form(GEN, GEO).
data(Form, Input_data) ->
Data = maps:from_list(Input_data),
{form, Items, Parse, Placeholder} = Form,
_pipe = Items,
_pipe@1 = update_fields(
_pipe,
fun(Field) -> case gleam@dict:get(Data, erlang:element(2, Field)) of
{ok, Value} ->
formz@field:set_raw_value(Field, Value);
{error, _} ->
Field
end end
),
{form, _pipe@1, Parse, Placeholder}.
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 351).
-spec parse(form(GEU, GEV)) -> {ok, GEV} | {error, form(GEU, GEV)}.
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.gleam", 377).
-spec parse_then_try(
form(GFC, GFD),
fun((form(GFC, GFD), GFD) -> {ok, GFI} | {error, form(GFC, GFD)})
) -> {ok, GFI} | {error, form(GFC, GFD)}.
parse_then_try(Form, Fun) ->
_pipe = Form,
_pipe@1 = parse(_pipe),
gleam@result:'try'(_pipe@1, fun(_capture) -> Fun(Form, _capture) end).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 427).
-spec items(form(GGE, any())) -> list(form_item(GGE)).
items(Form) ->
erlang:element(2, Form).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 433).
-spec get(form(GGK, any()), binary()) -> {ok, form_item(GGK)} | {error, nil}.
get(Form, Name) ->
gleam@list:find(erlang:element(2, Form), fun(Item) -> case Item of
{field, I, _} when erlang:element(2, I) =:= Name ->
true;
{sub_form, S, _} when erlang:element(2, S) =:= Name ->
true;
_ ->
false
end end).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 389).
-spec validate(form(GFR, GFS), list(binary())) -> form(GFR, GFS).
validate(Form, Names) ->
case (erlang:element(3, Form))(erlang:element(2, Form)) of
{ok, _} ->
Form;
{error, Items} ->
Items@1 = update_fields(
Items,
fun(Field) ->
case gleam@list:find(
Names,
fun(Name) -> erlang:element(2, Field) =:= Name end
) of
{ok, _} ->
Field;
{error, _} ->
case get(Form, erlang:element(2, Field)) of
{ok, {field, F, _}} ->
F;
_ ->
Field
end
end
end
),
erlang:setelement(2, Form, Items@1)
end.
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 416).
-spec validate_all(form(GFY, GFZ)) -> form(GFY, GFZ).
validate_all(Form) ->
Names = begin
_pipe = Form,
_pipe@1 = get_fields(_pipe),
gleam@list:map(_pipe@1, fun(F) -> erlang:element(2, F) end)
end,
validate(Form, Names).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 458).
-spec do_formitems_update(
list(form_item(GGY)),
binary(),
fun((form_item(GGY)) -> form_item(GGY))
) -> list(form_item(GGY)).
do_formitems_update(Items, Name, Fun) ->
gleam@list:map(Items, fun(Item) -> case Item of
{field, F, _} when erlang:element(2, F) =:= Name ->
Fun(Item);
{sub_form, S, _} when erlang:element(2, S) =:= Name ->
Fun(Item);
{sub_form, S@1, Items@1} ->
{sub_form, S@1, do_formitems_update(Items@1, Name, Fun)};
_ ->
Item
end end).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 449).
-spec update(form(GGR, GGS), binary(), fun((form_item(GGR)) -> form_item(GGR))) -> form(GGR, GGS).
update(Form, Name, Fun) ->
Items = do_formitems_update(erlang:element(2, Form), Name, Fun),
erlang:setelement(2, Form, Items).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 481).
-spec update_field(
form(GHF, GHG),
binary(),
fun((formz@field:field()) -> formz@field:field())
) -> form(GHF, GHG).
update_field(Form, Name, Fun) ->
update(Form, Name, fun(Item) -> case Item of
{field, Field, Widget} ->
{field, Fun(Field), Widget};
_ ->
Item
end end).
-file("/Users/benjamin/Projects/formz/formz/src/formz.gleam", 502).
-spec update_subform(
form(GHL, GHM),
binary(),
fun((formz@subform:sub_form()) -> formz@subform:sub_form())
) -> form(GHL, GHM).
update_subform(Form, Name, Fun) ->
update(Form, Name, fun(Item) -> case Item of
{sub_form, Details, Items} ->
{sub_form, Fun(Details), Items};
_ ->
Item
end end).