-module(glerd_valid). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([generate/2]). -spec generate(binary(), list({binary(), binary(), any(), binary()})) -> nil. generate(Root, Record_info) -> Imports = begin _pipe = Record_info, _pipe@1 = gleam@list:map( _pipe, fun(Ri) -> {_, Module_name, _, _} = Ri, <<"import "/utf8, Module_name/binary>> end ), _pipe@2 = gleam@list:unique(_pipe@1), gleam@string:join(_pipe@2, <<"\n"/utf8>>) end, Gen_content = gleam@list:fold( Record_info, <<"// this file was generated via glerd_valid import gleam/bool "/utf8, Imports/binary>>, fun(Acc, Rinfo) -> {Record_name, Module_name@1, _, Meta} = Rinfo, _assert_subject = begin _pipe@3 = <<"valid:(\\w+):'([\\w=, ]+)'"/utf8>>, gleam@regex:from_string(_pipe@3) end, {ok, Re} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"glerd_valid"/utf8>>, function => <<"generate"/utf8>>, line => 26}) end, Validations = gleam@regex:scan(Re, Meta), Validation_body = <<(begin _pipe@7 = (gleam@list:flat_map( Validations, fun(Validation) -> {match, _, [{some, Field_name}, {some, Rules}]} = case Validation of {match, _, [{some, _}, {some, _}]} -> Validation; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail@1, module => <<"glerd_valid"/utf8>>, function => <<"generate"/utf8>>, line => 32}) end, Rules@1 = begin _pipe@4 = Rules, gleam@string:split(_pipe@4, <<","/utf8>>) end, gleam@list:flat_map( Rules@1, fun(Rule) -> _assert_subject@1 = begin _pipe@5 = <<"(\\w+)=(\\w+)"/utf8>>, gleam@regex:from_string(_pipe@5) end, {ok, Re@1} = case _assert_subject@1 of {ok, _} -> _assert_subject@1; _assert_fail@2 -> erlang:error( #{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail@2, module => <<"glerd_valid"/utf8>>, function => <<"generate"/utf8>>, line => 35} ) end, _assert_subject@2 = gleam@regex:scan( Re@1, begin _pipe@6 = Rule, gleam@string:trim(_pipe@6) end ), [{match, _, [{some, Key}, {some, Val}]}] = case _assert_subject@2 of [{match, _, [{some, _}, {some, _}]}] -> _assert_subject@2; _assert_fail@3 -> erlang:error( #{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail@3, module => <<"glerd_valid"/utf8>>, function => <<"generate"/utf8>>, line => 36} ) end, case Key of <<"gte"/utf8>> -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name/binary>>/binary, " >= "/utf8>>/binary, Val/binary>>/binary, " } |> bool.negate, Error(\""/utf8>>/binary, Module_name@1/binary>>/binary, "."/utf8>>/binary, Record_name/binary>>/binary, "."/utf8>>/binary, Field_name/binary>>/binary, " should be greater or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; <<"gt"/utf8>> -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name/binary>>/binary, " > "/utf8>>/binary, Val/binary>>/binary, " } |> bool.negate, Error(\""/utf8>>/binary, Module_name@1/binary>>/binary, "."/utf8>>/binary, Record_name/binary>>/binary, "."/utf8>>/binary, Field_name/binary>>/binary, " should be greater than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; <<"lte"/utf8>> -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name/binary>>/binary, " <= "/utf8>>/binary, Val/binary>>/binary, " } |> bool.negate, Error(\""/utf8>>/binary, Module_name@1/binary>>/binary, "."/utf8>>/binary, Record_name/binary>>/binary, "."/utf8>>/binary, Field_name/binary>>/binary, " should be less or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; <<"lt"/utf8>> -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name/binary>>/binary, " < "/utf8>>/binary, Val/binary>>/binary, " } |> bool.negate, Error(\""/utf8>>/binary, Module_name@1/binary>>/binary, "."/utf8>>/binary, Record_name/binary>>/binary, "."/utf8>>/binary, Field_name/binary>>/binary, " should be less than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; <<"eq"/utf8>> -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name/binary>>/binary, " == "/utf8>>/binary, Val/binary>>/binary, " } |> bool.negate, Error(\""/utf8>>/binary, Module_name@1/binary>>/binary, "."/utf8>>/binary, Record_name/binary>>/binary, "."/utf8>>/binary, Field_name/binary>>/binary, " should be equal to "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; <<"ne"/utf8>> -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name/binary>>/binary, " != "/utf8>>/binary, Val/binary>>/binary, " } |> bool.negate, Error(\""/utf8>>/binary, Module_name@1/binary>>/binary, "."/utf8>>/binary, Record_name/binary>>/binary, "."/utf8>>/binary, Field_name/binary>>/binary, " should not be equal to "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; _ -> erlang:error(#{gleam_error => panic, message => (<<"Unknown rule key: "/utf8, Key/binary>>), module => <<"glerd_valid"/utf8>>, function => <<"generate"/utf8>>, line => 63}) end end ) end )), gleam@string:join(_pipe@7, <<"\n"/utf8>>) end)/binary, "\n Ok(Nil)"/utf8>>, <<<<<<<<<<<<<<<<<>/binary, (justin:snake_case(Record_name))/binary>>/binary, "_valid(x: "/utf8>>/binary, Module_name@1/binary>>/binary, "."/utf8>>/binary, Record_name/binary>>/binary, ") { "/utf8>>/binary, Validation_body/binary>>/binary, " } "/utf8>> end ), Gen_file_path = <<<<"./"/utf8, Root/binary>>/binary, "/glerd_valid_gen.gleam"/utf8>>, _assert_subject@3 = simplifile:write(Gen_file_path, Gen_content), {ok, _} = case _assert_subject@3 of {ok, _} -> _assert_subject@3; _assert_fail@4 -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail@4, module => <<"glerd_valid"/utf8>>, function => <<"generate"/utf8>>, line => 78}) end, _assert_subject@4 = gleamyshell_ffi:execute( <<"gleam"/utf8>>, <<"."/utf8>>, [<<"format"/utf8>>, Gen_file_path] ), {ok, _} = case _assert_subject@4 of {ok, _} -> _assert_subject@4; _assert_fail@5 -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail@5, module => <<"glerd_valid"/utf8>>, function => <<"generate"/utf8>>, line => 80}) end, nil.