-module(glerd_valid). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([generate/2]). -spec generate( binary(), list({binary(), binary(), list({binary(), glerd@types:field_type()}), 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 import gleam/string "/utf8, Imports/binary>>, fun(Acc, Rinfo) -> {Record_name, Module_name@1, Fields, 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 => 29}) end, Validations = gleam@regex:scan(Re, Meta), Field_type_by_name = begin _pipe@4 = Fields, gleam@list:fold( _pipe@4, gleam@dict:new(), fun(Acc@1, Field) -> {Field_name, Typ} = Field, gleam@dict:insert(Acc@1, Field_name, Typ) end ) end, Validation_body = <<(begin _pipe@8 = (gleam@list:flat_map( Validations, fun(Validation) -> {match, _, [{some, Field_name@1}, {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 => 42}) end, Rules@1 = begin _pipe@5 = Rules, gleam@string:split(_pipe@5, <<","/utf8>>) end, gleam@list:flat_map( Rules@1, fun(Rule) -> _assert_subject@1 = begin _pipe@6 = <<"(\\w+)=([\\w\\.]+)"/utf8>>, gleam@regex:from_string(_pipe@6) 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 => 45} ) end, _assert_subject@2 = gleam@regex:scan( Re@1, begin _pipe@7 = Rule, gleam@string:trim(_pipe@7) 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 => 46} ) end, case {Key, gleam@dict:get( Field_type_by_name, Field_name@1 )} of {<<"gte"/utf8>>, {ok, is_int}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be greater or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"min"/utf8>>, {ok, is_int}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be greater or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"gte"/utf8>>, {ok, is_float}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be greater or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"min"/utf8>>, {ok, is_float}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be greater or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"gte"/utf8>>, {ok, is_string}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ string.length(x."/utf8, Field_name@1/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@1/binary>>/binary, " length should be greater or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"min"/utf8>>, {ok, is_string}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ string.length(x."/utf8, Field_name@1/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@1/binary>>/binary, " length should be greater or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"gt"/utf8>>, {ok, is_int}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be greater than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"gt"/utf8>>, {ok, is_float}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be greater than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"gt"/utf8>>, {ok, is_string}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ string.length(x."/utf8, Field_name@1/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@1/binary>>/binary, " length should be greater than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"lte"/utf8>>, {ok, is_int}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be less or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"max"/utf8>>, {ok, is_int}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be less or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"lte"/utf8>>, {ok, is_float}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be less or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"max"/utf8>>, {ok, is_float}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be less or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"lte"/utf8>>, {ok, is_string}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ string.length(x."/utf8, Field_name@1/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@1/binary>>/binary, " length should be less or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"max"/utf8>>, {ok, is_string}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ string.length(x."/utf8, Field_name@1/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@1/binary>>/binary, " length should be less or equal than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"lt"/utf8>>, {ok, is_int}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be less than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"lt"/utf8>>, {ok, is_float}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be less than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"lt"/utf8>>, {ok, is_string}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ string.length(x."/utf8, Field_name@1/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@1/binary>>/binary, " length should be less than "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"eq"/utf8>>, {ok, is_int}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be equal to "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"eq"/utf8>>, {ok, is_float}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be equal to "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"eq"/utf8>>, {ok, is_string}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should be equal to \\\""/utf8>>/binary, Val/binary>>/binary, "\\\"\")) "/utf8>>]; {<<"ne"/utf8>>, {ok, is_int}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should not be equal to "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"ne"/utf8>>, {ok, is_float}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/binary>>/binary, " should not be equal to "/utf8>>/binary, Val/binary>>/binary, "\")) "/utf8>>]; {<<"ne"/utf8>>, {ok, is_string}} -> [<<<<<<<<<<<<<<<<<<<<<<<<" use <- bool.guard({ x."/utf8, Field_name@1/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@1/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 => 113}) end end ) end )), gleam@string:join(_pipe@8, <<"\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 => 128}) 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 => 130}) end, nil.