-module(formz@formz_use). -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]). -opaque form(HAI, HAJ) :: {form, list(formz:form_item(HAI)), fun((list(formz:form_item(HAI))) -> {ok, HAJ} | {error, list(formz:form_item(HAI))}), HAJ}. -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 18). -spec create_form(HAK) -> form(any(), HAK). create_form(Thing) -> {form, [], fun(_) -> {ok, Thing} end, Thing}. -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 162). -spec pop_field(list(formz:form_item(HCD))) -> {ok, {formz:form_item(HCD), list(formz:form_item(HCD))}} | {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_use.gleam", 22). -spec add( formz@field:field(), fun((formz@field:field(), formz@widget:args()) -> HAO), fun((binary()) -> {ok, HAQ} | {error, binary()}), HAQ, fun((HAQ) -> form(HAO, HAT)) ) -> form(HAO, HAT). 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}, Pop_fields}} = 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_use"/utf8>>, function => <<"add"/utf8>>, line => 43}) 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))(Pop_fields), case {Form_output, Input_output} of {{ok, _}, {ok, _}} -> Form_output; {{error, Items@1}, {ok, _}} -> {error, [{field, Field@1, Widget@1} | Items@1]}; {{ok, _}, {error, Error}} -> _pipe@1 = Field@1, _pipe@2 = formz@field:set_error(_pipe@1, Error), _pipe@3 = {field, _pipe@2, Widget@1}, _pipe@4 = gleam@list:prepend(Pop_fields, _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 = {field, _pipe@6, Widget@1}, _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", 87). -spec optional( formz@field:field(), formz@definition:definition(HAY, any(), HBA), fun((HBA) -> form(HAY, HBE)) ) -> form(HAY, HBE). optional(Field, Definition, Fun) -> add( Field, 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/formz_use.gleam", 101). -spec require( formz@field:field(), formz@definition:definition(HBJ, HBK, any()), fun((HBK) -> form(HBJ, HBP)) ) -> form(HBJ, HBP). 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/formz_use.gleam", 179). -spec do_get_fields(list(formz: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/formz_use.gleam", 175). -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/formz_use.gleam", 189). -spec update_fields( list(formz:form_item(HCU)), fun((formz@field:field()) -> formz@field:field()) ) -> list(formz:form_item(HCU)). 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_use.gleam", 115). -spec subform( formz@subform:sub_form(), form(HBU, HBV), fun((HBV) -> form(HBU, HBY)) ) -> form(HBU, HBY). 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/formz_use"/utf8>>, function => <<"subform"/utf8>>, line => 132}) 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, [{sub_form, Details@1, Items@1} | Items@1]}; {{ok, _}, {error, Error_fields}} -> {error, [{sub_form, Details@1, Error_fields} | Next_items]}; {{error, Fields}, {error, Error_fields@1}} -> {error, gleam@list:prepend( Fields, {sub_form, 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", 201). -spec data(form(HCZ, HDA), list({binary(), binary()})) -> form(HCZ, HDA). 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/formz_use.gleam", 217). -spec parse(form(HDG, HDH)) -> {ok, HDH} | {error, form(HDG, HDH)}. 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", 224). -spec parse_then_try( form(HDO, HDP), fun((form(HDO, HDP), HDP) -> {ok, HDU} | {error, form(HDO, HDP)}) ) -> {ok, HDU} | {error, form(HDO, HDP)}. 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/formz_use.gleam", 263). -spec items(form(HEQ, any())) -> list(formz:form_item(HEQ)). items(Form) -> erlang:element(2, Form). -file("/Users/benjamin/Projects/formz/formz/src/formz/formz_use.gleam", 267). -spec get(form(HEW, any()), binary()) -> {ok, formz:form_item(HEW)} | {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/formz_use.gleam", 231). -spec validate(form(HED, HEE), list(binary())) -> form(HED, HEE). 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/formz_use.gleam", 254). -spec validate_all(form(HEK, HEL)) -> form(HEK, HEL). 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_use.gleam", 289). -spec do_formitems_update( list(formz:form_item(HFK)), binary(), fun((formz:form_item(HFK)) -> formz:form_item(HFK)) ) -> list(formz:form_item(HFK)). 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/formz_use.gleam", 280). -spec update( form(HFD, HFE), binary(), fun((formz:form_item(HFD)) -> formz:form_item(HFD)) ) -> form(HFD, HFE). 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/formz_use.gleam", 304). -spec update_field( form(HFR, HFS), binary(), fun((formz@field:field()) -> formz@field:field()) ) -> form(HFR, HFS). 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_use.gleam", 317). -spec update_subform( form(HFX, HFY), binary(), fun((formz@subform:sub_form()) -> formz@subform:sub_form()) ) -> form(HFX, HFY). 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).