Current section
Files
Jump to
Current section
Files
src/glerd_valid.erl
-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_bool}} ->
[<<<<<<<<<<<<<<<<<<<<<<<<"
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_bool}} ->
[<<<<<<<<<<<<<<<<<<<<<<<<"
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>>];
{Key@1, Typ@1} ->
erlang:error(#{gleam_error => panic,
message => (<<<<<<"Unknown rule for key: "/utf8,
Key@1/binary>>/binary,
" , type: "/utf8>>/binary,
(gleam@string:inspect(
Typ@1
))/binary>>),
module => <<"glerd_valid"/utf8>>,
function => <<"generate"/utf8>>,
line => 120})
end
end
)
end
)),
gleam@string:join(_pipe@8, <<"\n"/utf8>>)
end)/binary,
"\n Ok(Nil)"/utf8>>,
<<<<<<<<<<<<<<<<<<Acc/binary, "
pub fn "/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 => 140})
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 => 142})
end,
nil.