-module(glerd). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([generate/1, main/0]). -spec path_to_module_name(binary(), binary()) -> binary(). path_to_module_name(Dir, Path) -> _pipe = Path, _pipe@1 = gleam@string:replace(_pipe, <>, <<""/utf8>>), gleam@string:replace(_pipe@1, <<".gleam"/utf8>>, <<""/utf8>>). -spec type_args(list(glance:type())) -> binary(). type_args(Types) -> _pipe = Types, _pipe@1 = gleam@list:map(_pipe, fun field_type/1), _pipe@2 = gleam@list:intersperse(_pipe@1, <<","/utf8>>), gleam@string:join(_pipe@2, <<""/utf8>>). -spec field_type(glance:type()) -> binary(). field_type(Typ) -> case Typ of {named_type, Type_name, _, _} when Type_name =:= <<"String"/utf8>> -> <<"types.IsString"/utf8>>; {named_type, Type_name@1, _, _} when Type_name@1 =:= <<"Int"/utf8>> -> <<"types.IsInt"/utf8>>; {named_type, Type_name@2, _, _} when Type_name@2 =:= <<"Float"/utf8>> -> <<"types.IsFloat"/utf8>>; {named_type, Type_name@3, _, _} when Type_name@3 =:= <<"Bool"/utf8>> -> <<"types.IsBool"/utf8>>; {named_type, Type_name@4, _, [Typ@1]} when Type_name@4 =:= <<"List"/utf8>> -> <<<<"types.IsList("/utf8, (field_type(Typ@1))/binary>>/binary, ")"/utf8>>; {named_type, Type_name@5, _, [Key_type, Val_type]} when Type_name@5 =:= <<"Dict"/utf8>> -> <<<<"types.IsDict("/utf8, (type_args([Key_type, Val_type]))/binary>>/binary, ")"/utf8>>; {named_type, Type_name@6, _, [Typ@2]} when Type_name@6 =:= <<"Option"/utf8>> -> <<<<"types.IsOption("/utf8, (field_type(Typ@2))/binary>>/binary, ")"/utf8>>; {named_type, Type_name@7, _, [Typ1, Typ2]} when Type_name@7 =:= <<"Result"/utf8>> -> <<<<"types.IsResult("/utf8, (type_args([Typ1, Typ2]))/binary>>/binary, ")"/utf8>>; {tuple_type, [Typ1@1, Typ2@1]} -> <<<<"types.IsTuple2("/utf8, (type_args([Typ1@1, Typ2@1]))/binary>>/binary, ")"/utf8>>; {tuple_type, [Typ1@2, Typ2@2, Typ3]} -> <<<<"types.IsTuple3("/utf8, (type_args([Typ1@2, Typ2@2, Typ3]))/binary>>/binary, ")"/utf8>>; {tuple_type, [Typ1@3, Typ2@3, Typ3@1, Typ4]} -> <<<<"types.IsTuple4("/utf8, (type_args([Typ1@3, Typ2@3, Typ3@1, Typ4]))/binary>>/binary, ")"/utf8>>; {tuple_type, [Typ1@4, Typ2@4, Typ3@2, Typ4@1, Typ5]} -> <<<<"types.IsTuple5("/utf8, (type_args([Typ1@4, Typ2@4, Typ3@2, Typ4@1, Typ5]))/binary>>/binary, ")"/utf8>>; {tuple_type, [Typ1@5, Typ2@5, Typ3@3, Typ4@2, Typ5@1, Typ6]} -> <<<<"types.IsTuple6("/utf8, (type_args([Typ1@5, Typ2@5, Typ3@3, Typ4@2, Typ5@1, Typ6]))/binary>>/binary, ")"/utf8>>; {named_type, Record_name, _, _} -> <<<<"types.IsRecord(\""/utf8, Record_name/binary>>/binary, "\")"/utf8>>; _ -> <<"types.Unknown"/utf8>> end. -spec generate(binary()) -> nil. generate(Root) -> Records_info = begin _pipe = fswalk:builder(), _pipe@1 = fswalk:with_path(_pipe, Root), _pipe@2 = fswalk:walk(_pipe@1), _pipe@3 = gleam@iterator:filter( _pipe@2, fun(Entry_result) -> case Entry_result of {ok, {entry, Path, {stat, Is_dir}}} -> ((Is_dir =:= false) andalso gleam@string:ends_with( Path, <<".gleam"/utf8>> )) andalso not gleam_stdlib:contains_string( Path, <<"glerd_gen.gleam"/utf8>> ); _ -> false end end ), _pipe@4 = gleam@iterator:map( _pipe@3, fun(Entry_result@1) -> {ok, {entry, Path@1, _}} = case Entry_result@1 of {ok, {entry, _, _}} -> Entry_result@1; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail, module => <<"glerd"/utf8>>, function => <<"generate"/utf8>>, line => 32}) end, fun(_) -> {path_to_module_name(Root, Path@1), Path@1} end end ), _pipe@5 = gleam@iterator:map( _pipe@4, fun(Action) -> act:map( Action, fun(Path@2) -> _assert_subject = simplifile:read(Path@2), {ok, Content} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Assertion pattern match failed"/utf8>>, value => _assert_fail@1, module => <<"glerd"/utf8>>, function => <<"generate"/utf8>>, line => 37}) end, Content end ) end ), _pipe@6 = gleam@iterator:map( _pipe@5, fun(Action@1) -> act:map( Action@1, fun(Content@1) -> _assert_subject@1 = glance:module(Content@1), {ok, Module} = 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"/utf8>>, function => <<"generate"/utf8>>, line => 42}) end, Module end ) end ), _pipe@7 = gleam@iterator:map( _pipe@6, fun(Action@2) -> act:map( Action@2, fun(Module@1) -> {module, _, Custom_types_definitions, _, _, _} = Module@1, Custom_types_definitions end ) end ), _pipe@10 = gleam@iterator:flat_map( _pipe@7, fun(Action@3) -> _pipe@9 = begin {M_name, Custom_type_definitions} = Action@3(<<""/utf8>>), gleam@list:flat_map( Custom_type_definitions, fun(Custom_type_definition) -> {definition, _, Custom_type} = Custom_type_definition, {custom_type, _, _, _, _, Variants} = Custom_type, gleam@list:map( Variants, fun(Variant) -> {variant, R_name, Fields} = Variant, Fields@1 = begin _pipe@8 = (gleam@list:map( Fields, fun(Field) -> {field, Field_name, Typ} = Field, _assert_subject@2 = gleam@option:'or'( Field_name, {some, <<"__none__"/utf8>>} ), {some, Field_name@1} = case _assert_subject@2 of {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"/utf8>>, function => <<"generate"/utf8>>, line => 62} ) end, <<<<<<<<"#(\""/utf8, Field_name@1/binary>>/binary, "\", "/utf8>>/binary, (field_type(Typ))/binary>>/binary, ")"/utf8>> end )), gleam@string:join(_pipe@8, <<","/utf8>>) end, <<<<<<<<<<<<<<"#(\""/utf8, R_name/binary>>/binary, "\",\""/utf8>>/binary, M_name/binary>>/binary, "\","/utf8>>/binary, "["/utf8>>/binary, Fields@1/binary>>/binary, "])"/utf8>> end ) end ) end, gleam@iterator:from_list(_pipe@9) end ), gleam@iterator:fold( _pipe@10, <<""/utf8>>, fun(Acc, El) -> <<<>/binary, ",\n"/utf8>> end ) end, Gen_file_path = <<<<"./"/utf8, Root/binary>>/binary, "/glerd_gen.gleam"/utf8>>, _assert_subject@3 = simplifile:write( Gen_file_path, <<<<"// this file was generated via \"gleam run -m glerd\" import glerd/types pub const record_info = ["/utf8, Records_info/binary>>/binary, "]"/utf8>> ), {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"/utf8>>, function => <<"generate"/utf8>>, line => 75}) 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"/utf8>>, function => <<"generate"/utf8>>, line => 85}) end, nil. -spec main() -> nil. main() -> generate(<<"src"/utf8>>).