Current section
Files
Jump to
Current section
Files
src/formz@formz_builder.erl
-module(formz@formz_builder).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/0, optional/3, require/3, add_form/3, data/2, decodes/2, parse/1, parse_then_try/2, items/1, get/2, update/3, update_field/3, update_subform/3]).
-export_type([has_decoder/0, no_decoder/0, form/4, form_item/1]).
-type has_decoder() :: any().
-type no_decoder() :: any().
-opaque form(GBP, GBQ, GBR, GBS) :: {form,
list(form_item(GBP)),
fun((list(form_item(GBP)), GBR) -> {ok, GBQ} |
{error, list(form_item(GBP))}),
gleam@option:option(GBR)} |
{gleam_phantom, GBS}.
-type form_item(GBT) :: {element,
formz@field:field(),
fun((formz@field:field(), formz@widget:args()) -> GBT)} |
{set, formz@subform:sub_form(), list(form_item(GBT))}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 29).
-spec new() -> form(any(), GBV, GBV, no_decoder()).
new() ->
{form, [], fun(_, Output) -> {ok, Output} end, none}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 171).
-spec pop_element(list(form_item(GEQ))) -> {ok,
{form_item(GEQ), list(form_item(GEQ))}} |
{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_builder.gleam", 33).
-spec add(
form(GCA, fun((GCB) -> GCC), GCD, GCE),
formz@field:field(),
fun((formz@field:field(), formz@widget:args()) -> GCA),
fun((binary()) -> {ok, GCB} | {error, binary()})
) -> form(GCA, GCC, GCD, GCE).
add(Previous_form, Field, Widget, Parse_field) ->
Updated_items = [{element, Field, Widget} |
erlang:element(2, Previous_form)],
Parse_with = fun(Items, Decoder) ->
_assert_subject = pop_element(Items),
{ok, {{element, Field@1, Widget@1}, Rest}} = 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_builder"/utf8>>,
function => <<"add"/utf8>>,
line => 49})
end,
Previous_form_output = (erlang:element(3, Previous_form))(Rest, Decoder),
Input_output = Parse_field(erlang:element(8, Field@1)),
case {Previous_form_output, Input_output} of
{{ok, Previous_decoder}, {ok, Value}} ->
{ok, Previous_decoder(Value)};
{{error, Items@1}, {ok, _}} ->
{error, [{element, Field@1, Widget@1} | Items@1]};
{{ok, _}, {error, Error}} ->
_pipe = Field@1,
_pipe@1 = formz@field:set_error(_pipe, Error),
_pipe@2 = {element, _pipe@1, Widget@1},
_pipe@3 = gleam@list:prepend(Rest, _pipe@2),
{error, _pipe@3};
{{error, Items@2}, {error, Error@1}} ->
_pipe@4 = Field@1,
_pipe@5 = formz@field:set_error(_pipe@4, Error@1),
_pipe@6 = {element, _pipe@5, Widget@1},
_pipe@7 = gleam@list:prepend(Items@2, _pipe@6),
{error, _pipe@7}
end
end,
{form, Updated_items, Parse_with, erlang:element(4, Previous_form)}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 89).
-spec optional(
form(GCQ, fun((GCR) -> GCS), GCT, GCU),
formz@field:field(),
formz@definition:definition(GCQ, any(), GCR)
) -> form(GCQ, GCS, GCT, GCU).
optional(Previous_form, Field, Definition) ->
add(
Previous_form,
Field,
erlang:element(2, Definition),
fun(_capture) ->
(erlang:element(5, Definition))(
erlang:element(3, Definition),
_capture
)
end
).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 105).
-spec require(
form(GDH, fun((GDI) -> GDJ), GDK, GDL),
formz@field:field(),
formz@definition:definition(GDH, GDI, any())
) -> form(GDH, GDJ, GDK, GDL).
require(Previous_form, Field, Definition) ->
add(
Previous_form,
begin
_pipe = Field,
formz@field:set_required(_pipe, true)
end,
erlang:element(2, Definition),
erlang:element(3, Definition)
).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 184).
-spec map_fields(
list(form_item(GEY)),
fun((formz@field:field()) -> formz@field:field())
) -> list(form_item(GEY)).
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_builder.gleam", 123).
-spec add_form(
form(GDY, fun((GDZ) -> GEA), GEB, GEC),
formz@subform:sub_form(),
form(GDY, GDZ, any(), has_decoder())
) -> form(GDY, GEA, GEB, GEC).
add_form(Previous_form, Details, 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, Previous_form)],
Parse_with = fun(Items, Decoder) ->
_assert_subject = pop_element(Items),
{ok, {{set, Details@1, Sub_items@1}, Rest}} = case _assert_subject of
{ok, {{set, _, _}, _}} -> _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_builder"/utf8>>,
function => <<"add_form"/utf8>>,
line => 144})
end,
{form, _, Sub_parse_with, {some, Sub_decoder}} = case Sub of
{form, _, _, {some, _}} -> Sub;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail@1,
module => <<"formz/formz_builder"/utf8>>,
function => <<"add_form"/utf8>>,
line => 146})
end,
Form_output = Sub_parse_with(Sub_items@1, Sub_decoder),
Previous_form_output = (erlang:element(3, Previous_form))(Rest, Decoder),
case {Previous_form_output, Form_output} of
{{ok, Next}, {ok, Value}} ->
{ok, Next(Value)};
{{error, Items@1}, {ok, _}} ->
{error, [{set, Details@1, Items@1} | Items@1]};
{{ok, _}, {error, Error_fields}} ->
{error, [{set, Details@1, Error_fields} | Rest]};
{{error, Fields}, {error, Error_fields@1}} ->
{error,
gleam@list:prepend(Fields, {set, Details@1, Error_fields@1})}
end
end,
{form, Updated_items, Parse_with, erlang:element(4, Previous_form)}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 196).
-spec data(form(GFD, GFE, GFF, GFG), list({binary(), binary()})) -> form(GFD, GFE, GFF, GFG).
data(Form, Input_data) ->
Data = maps:from_list(Input_data),
{form, Items, Parse, Decoder} = 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_raw_value(Field, Value);
{error, _} ->
Field
end end
),
{form, _pipe@1, Parse, Decoder}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 212).
-spec decodes(form(GFQ, GFR, GFS, any()), GFS) -> form(GFQ, GFR, GFS, has_decoder()).
decodes(Form, Decoder) ->
{form, Fields, Parse_with, _} = Form,
{form, Fields, Parse_with, {some, Decoder}}.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 230).
-spec parse(form(GGC, GGD, GGE, has_decoder())) -> {ok, GGD} |
{error, form(GGC, GGD, GGE, has_decoder())}.
parse(Form) ->
{form, Items, Parse_with, {some, Decoder}} = case Form of
{form, _, _, {some, _}} -> Form;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
value => _assert_fail,
module => <<"formz/formz_builder"/utf8>>,
function => <<"parse"/utf8>>,
line => 235})
end,
case Parse_with(Items, Decoder) of
{ok, Output} ->
{ok, Output};
{error, Items@1} ->
{error, {form, Items@1, Parse_with, {some, Decoder}}}
end.
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 242).
-spec parse_then_try(
form(GGP, GGQ, GGR, has_decoder()),
fun((form(GGP, GGQ, GGR, has_decoder()), GGQ) -> {ok, GHA} |
{error, form(GGP, GGQ, GGR, has_decoder())})
) -> {ok, GHA} | {error, form(GGP, GGQ, GGR, has_decoder())}.
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_builder.gleam", 250).
-spec items(form(GHN, any(), any(), any())) -> list(form_item(GHN)).
items(Form) ->
_pipe = erlang:element(2, Form),
lists:reverse(_pipe).
-file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 254).
-spec get(form(GHX, any(), any(), any()), binary()) -> {ok, form_item(GHX)} |
{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_builder.gleam", 279).
-spec do_formitem_update(
list(form_item(GIT)),
binary(),
fun((form_item(GIT)) -> form_item(GIT))
) -> list(form_item(GIT)).
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_builder.gleam", 269).
-spec update(
form(GII, GIJ, GIK, any()),
binary(),
fun((form_item(GII)) -> form_item(GII))
) -> form(GII, GIJ, GIK, any()).
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_builder.gleam", 295).
-spec update_field(
form(GJA, GJB, GJC, GJD),
binary(),
fun((formz@field:field()) -> formz@field:field())
) -> form(GJA, GJB, GJC, GJD).
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_builder.gleam", 308).
-spec update_subform(
form(GJM, GJN, GJO, GJP),
binary(),
fun((formz@subform:sub_form()) -> formz@subform:sub_form())
) -> form(GJM, GJN, GJO, GJP).
update_subform(Form, Name, Fun) ->
update(Form, Name, fun(Item) -> case Item of
{set, Details, Items} ->
{set, Fun(Details), Items};
_ ->
Item
end end).