-module(formz@formz_builder). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([new/0, optional/3, require/3, get_fields/1, subform/3, data/2, set_decoder/2, decodes/1, 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([has_decoder/0, no_decoder/0, form/4]). -type has_decoder() :: any(). -type no_decoder() :: any(). -opaque form(GBS, GBT, GBU, GBV) :: {form, list(formz:form_item(GBS)), fun((list(formz:form_item(GBS)), GBU) -> {ok, GBT} | {error, list(formz:form_item(GBS))}), gleam@option:option(GBU)} | {gleam_phantom, GBV}. -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 61). -spec new() -> form(any(), GBX, GBX, no_decoder()). new() -> {form, [], fun(_, Output) -> {ok, Output} end, none}. -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 262). -spec pop_field(list(formz:form_item(GEY))) -> {ok, {formz:form_item(GEY), list(formz:form_item(GEY))}} | {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/formz_builder.gleam", 104). -spec add( form(GCI, fun((GCJ) -> GCK), GCL, GCM), formz@field:field(), fun((formz@field:field(), formz@widget:args()) -> GCI), fun((binary()) -> {ok, GCJ} | {error, binary()}) ) -> form(GCI, GCK, GCL, GCM). add(Previous_form, Field, Widget, Parse_field) -> Updated_items = [{field, Field, Widget} | erlang:element(2, Previous_form)], Parse_with = fun(Items, Decoder) -> _assert_subject = pop_field(Items), {ok, {{field, Field@1, Widget@1}, Rest}} = 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/formz_builder"/utf8>>, function => <<"add"/utf8>>, line => 120}) 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, [{field, Field@1, Widget@1} | Items@1]}; {{ok, _}, {error, Error}} -> _pipe = Field@1, _pipe@1 = formz@field:set_error(_pipe, Error), _pipe@2 = {field, _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 = {field, _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", 164). -spec optional( form(GCY, fun((GCZ) -> GDA), GDB, GDC), formz@field:field(), formz@definition:definition(GCY, any(), GCZ) ) -> form(GCY, GDA, GDB, GDC). optional(Previous_form, Field, Definition) -> add( Previous_form, 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 ). -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 191). -spec require( form(GDP, fun((GDQ) -> GDR), GDS, GDT), formz@field:field(), formz@definition:definition(GDP, GDQ, any()) ) -> form(GDP, GDR, GDS, GDT). 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", 282). -spec do_get_fields(list(formz:form_item(any()))) -> list(formz@field:field()). do_get_fields(Items) -> 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). -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 276). -spec get_fields(form(any(), any(), 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/formz_builder.gleam", 291). -spec update_fields( list(formz:form_item(GFT)), fun((formz@field:field()) -> formz@field:field()) ) -> list(formz:form_item(GFT)). 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/formz_builder.gleam", 213). -spec subform( form(GEG, fun((GEH) -> GEI), GEJ, GEK), formz@subform:sub_form(), form(GEG, GEH, any(), has_decoder()) ) -> form(GEG, GEI, GEJ, GEK). subform(Previous_form, Details, 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, Previous_form)], Parse_with = fun(Items, Decoder) -> _assert_subject = pop_field(Items), {ok, {{sub_form, Details@1, Sub_items@1}, Rest}} = case _assert_subject of {ok, {{sub_form, _, _}, _}} -> _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 => <<"subform"/utf8>>, line => 234}) 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 => <<"subform"/utf8>>, line => 236}) 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, [{sub_form, Details@1, Items@1} | Items@1]}; {{ok, _}, {error, Error_fields}} -> {error, [{sub_form, Details@1, Error_fields} | Rest]}; {{error, Fields}, {error, Error_fields@1}} -> {error, gleam@list:prepend( Fields, {sub_form, 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", 307). -spec data(form(GFY, GFZ, GGA, GGB), list({binary(), binary()})) -> form(GFY, GFZ, GGA, GGB). data(Form, Input_data) -> Data = maps:from_list(Input_data), {form, Items, Parse, Decoder} = 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, Decoder}. -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 330). -spec set_decoder(form(GGL, GGM, GGN, any()), GGN) -> form(GGL, GGM, GGN, has_decoder()). set_decoder(Form, Decoder) -> {form, Fields, Parse_with, _} = Form, {form, Fields, Parse_with, {some, Decoder}}. -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 100). -spec decodes(GCC) -> form(any(), GCC, GCC, has_decoder()). decodes(Decoder) -> _pipe = new(), set_decoder(_pipe, Decoder). -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 347). -spec parse(form(GGX, GGY, GGZ, has_decoder())) -> {ok, GGY} | {error, form(GGX, GGY, GGZ, 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 => 352}) 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", 378). -spec parse_then_try( form(GHK, GHL, GHM, has_decoder()), fun((form(GHK, GHL, GHM, has_decoder()), GHL) -> {ok, GHV} | {error, form(GHK, GHL, GHM, has_decoder())}) ) -> {ok, GHV} | {error, form(GHK, GHL, GHM, 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", 431). -spec items(form(GJF, any(), any(), any())) -> list(formz:form_item(GJF)). items(Form) -> _pipe = erlang:element(2, Form), lists:reverse(_pipe). -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 437). -spec get(form(GJP, any(), any(), any()), binary()) -> {ok, formz:form_item(GJP)} | {error, nil}. get(Form, Name) -> _pipe = erlang:element(2, Form), _pipe@1 = gleam@list:filter(_pipe, 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), gleam@list:first(_pipe@1). -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 391). -spec validate(form(GII, GIJ, GIK, has_decoder()), list(binary())) -> form(GII, GIJ, GIK, has_decoder()). validate(Form, Names) -> case parse(Form) of {ok, _} -> Form; {error, F} -> Items = update_fields( erlang:element(2, F), 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@1, _}} -> F@1; _ -> Field end end end ), erlang:setelement(2, Form, Items) end. -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 418). -spec validate_all(form(GIU, GIV, GIW, has_decoder())) -> form(GIU, GIV, GIW, has_decoder()). 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/formz_builder.gleam", 465). -spec do_formitem_update( list(formz:form_item(GKL)), binary(), fun((formz:form_item(GKL)) -> formz:form_item(GKL)) ) -> list(formz:form_item(GKL)). do_formitem_update(Items, Name, Fun) -> _pipe = Items, gleam@list:map(_pipe, fun(Item) -> case Item of {field, I, _} when erlang:element(2, I) =:= 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_formitem_update(Items@1, Name, Fun)}; _ -> Item end end). -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_builder.gleam", 455). -spec update( form(GKA, GKB, GKC, any()), binary(), fun((formz:form_item(GKA)) -> formz:form_item(GKA)) ) -> form(GKA, GKB, GKC, 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", 489). -spec update_field( form(GKS, GKT, GKU, GKV), binary(), fun((formz@field:field()) -> formz@field:field()) ) -> form(GKS, GKT, GKU, GKV). 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/formz_builder.gleam", 510). -spec update_subform( form(GLE, GLF, GLG, GLH), binary(), fun((formz@subform:sub_form()) -> formz@subform:sub_form()) ) -> form(GLE, GLF, GLG, GLH). 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).