-module(deriv). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([consolidate_imports/1, consolidate_imports_for/2, build_same_file_writes/1, build_different_file_writes/1, build_writes/1, stop_warning/0, gen_derivs/2, main/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC("/ ///// ///// ///// ///// /////\n"). -file("src/deriv.gleam", 92). -spec find_project_src_gleam_filepaths() -> list(binary()). find_project_src_gleam_filepaths() -> _assert_subject = shellout:command( <<"find"/utf8>>, [<<"src"/utf8>>, <<"-name"/utf8>>, <<"*.gleam"/utf8>>], <<"."/utf8>>, [] ), {ok, Output} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"find_project_src_gleam_filepaths"/utf8>>, line => 93}) end, _pipe = Output, _pipe@1 = gleam@string:trim(_pipe), gleam@string:split(_pipe@1, <<"\n"/utf8>>). -file("src/deriv.gleam", 109). -spec project_name() -> binary(). project_name() -> _assert_subject = shellout:command( <<"cat"/utf8>>, [<<"gleam.toml"/utf8>>], <<"."/utf8>>, [] ), {ok, Output} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"project_name"/utf8>>, line => 110}) end, _assert_subject@1 = tom:parse(Output), {ok, Config} = case _assert_subject@1 of {ok, _} -> _assert_subject@1; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail@1, module => <<"deriv"/utf8>>, function => <<"project_name"/utf8>>, line => 111}) end, case tom:get_string(Config, [<<"name"/utf8>>]) of {error, _} -> erlang:error(#{gleam_error => panic, message => <<"Cannot determine project name from `gleam.toml`"/utf8>>, module => <<"deriv"/utf8>>, function => <<"project_name"/utf8>>, line => 114}); {ok, Name} -> Name end. -file("src/deriv.gleam", 171). -spec file_path_to_gleam_module_str(binary()) -> binary(). file_path_to_gleam_module_str(Path) -> _assert_subject = gleam@regexp:from_string(<<"^src[/]"/utf8>>), {ok, Leading_src_slash} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"file_path_to_gleam_module_str"/utf8>>, line => 172}) end, _assert_subject@1 = gleam@regexp:from_string(<<"[.]gleam$"/utf8>>), {ok, Trailing_dot_gleam} = case _assert_subject@1 of {ok, _} -> _assert_subject@1; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail@1, module => <<"deriv"/utf8>>, function => <<"file_path_to_gleam_module_str"/utf8>>, line => 173}) end, _pipe = Path, _pipe@1 = gleam_regexp_ffi:replace(Leading_src_slash, _pipe, <<""/utf8>>), gleam_regexp_ffi:replace(Trailing_dot_gleam, _pipe@1, <<""/utf8>>). -file("src/deriv.gleam", 165). -spec read_file(binary(), integer()) -> deriv@types:file(). read_file(Filepath, Idx) -> _assert_subject = simplifile:read(Filepath), {ok, Src} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"read_file"/utf8>>, line => 166}) end, Module = file_path_to_gleam_module_str(Filepath), {file, Module, Src, {some, Idx + 1}}. -file("src/deriv.gleam", 102). -spec load_files(list(binary())) -> list(deriv@types:file()). load_files(Filepaths) -> _pipe = Filepaths, gleam@list:index_map(_pipe, fun(Path, Idx) -> read_file(Path, Idx) end). -file("src/deriv.gleam", 180). -spec gleam_module_str_to_file_path(binary()) -> binary(). gleam_module_str_to_file_path(Module) -> <<<<"src/"/utf8, Module/binary>>/binary, ".gleam"/utf8>>. -file("src/deriv.gleam", 184). -spec parse_types_and_derivations(deriv@types:file()) -> list({glance:custom_type(), list(deriv@types:derivation()), gleam@dict:dict(deriv@types:deriv_field(), list(deriv@types:deriv_field_opt()))}). parse_types_and_derivations(File) -> Parsed = case glance:module(erlang:element(3, File)) of {error, Err} -> gleam@io:debug(File), gleam@io:debug(Err), erlang:error(#{gleam_error => panic, message => <<"`panic` expression evaluated."/utf8>>, module => <<"deriv"/utf8>>, function => <<"parse_types_and_derivations"/utf8>>, line => 190}); {ok, X} -> X end, _pipe = erlang:element(3, Parsed), _pipe@1 = gleam@list:map(_pipe, fun(Ct) -> erlang:element(3, Ct) end), _pipe@2 = gleam@list:map( _pipe@1, fun(_capture) -> deriv@parser:parse_type_with_derivations( _capture, erlang:element(3, File) ) end ), gleam@result:values(_pipe@2). -file("src/deriv.gleam", 202). -spec gen_type_derivs( {glance:custom_type(), list(deriv@types:derivation()), gleam@dict:dict(deriv@types:deriv_field(), list(deriv@types:deriv_field_opt()))}, deriv@types:file(), gleam@dict:dict(binary(), fun((glance:custom_type(), deriv@types:derivation(), gleam@dict:dict(deriv@types:deriv_field(), list(deriv@types:deriv_field_opt())), deriv@types:file(), fun((binary()) -> {ok, glance:module_()} | {error, deriv@types:module_reader_err()})) -> deriv@types:gen())), fun((binary()) -> {ok, glance:module_()} | {error, deriv@types:module_reader_err()}) ) -> list(deriv@types:gen()). gen_type_derivs(X, File, Gen_funcs, Module_reader) -> {Type_, Derivs, Field_opts} = X, _pipe = Derivs, _pipe@1 = gleam@list:map( _pipe, fun(D) -> case gleam_stdlib:map_get(Gen_funcs, erlang:element(2, D)) of {error, _} -> {error, nil}; {ok, F} -> {ok, F(Type_, D, Field_opts, File, Module_reader)} end end ), gleam@result:values(_pipe@1). -file("src/deriv.gleam", 315). -spec perform_file_writes(list(deriv@types:write())) -> nil. perform_file_writes(Xs) -> _pipe = Xs, gleam@list:each( _pipe, fun(Write) -> case erlang:element(4, Write) of {output, _, Deriv} -> Dir = gleam@string:replace( erlang:element(2, Write), (<>), <<""/utf8>> ), _assert_subject = simplifile:create_directory_all(Dir), {ok, _} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"perform_file_writes"/utf8>>, line => 321}) end, nil; _ -> nil end, _assert_subject@1 = simplifile:write( erlang:element(2, Write), erlang:element(3, Write) ), {ok, _} = case _assert_subject@1 of {ok, _} -> _assert_subject@1; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail@1, module => <<"deriv"/utf8>>, function => <<"perform_file_writes"/utf8>>, line => 329}) end end ). -file("src/deriv.gleam", 333). -spec output_path(deriv@types:output()) -> binary(). output_path(Output) -> case Output of {output, Module, Deriv} -> _pipe = [<<"src"/utf8>>, <<"deriv"/utf8>>, Module, <>], gleam@string:join(_pipe, <<"/"/utf8>>); {output_inline, _, Filepath} -> Filepath end. -file("src/deriv.gleam", 389). -spec build_module_imports(list(deriv@types:gen()), deriv@types:output()) -> list(glance:import()). build_module_imports(Gens, _) -> Files = begin _pipe = Gens, _pipe@1 = gleam@list:map(_pipe, fun(G) -> erlang:element(2, G) end), gleam@list:unique(_pipe@1) end, gleam@list:flat_map(Files, fun(File) -> case erlang:element(4, File) of {some, Idx} -> _pipe@2 = {import, erlang:element(2, File), {some, {named, <<"m"/utf8, (erlang:integer_to_binary(Idx))/binary>>}}, [], []}, (fun(X) -> [X] end)(_pipe@2); none -> [] end end). -file("src/deriv.gleam", 454). -spec consolidate_imports(list(glance:import())) -> list(glance:import()). consolidate_imports(All_imports) -> _pipe = All_imports, _pipe@1 = gleam@list:group(_pipe, fun(I) -> erlang:element(2, I) end), _pipe@2 = maps:to_list(_pipe@1), _pipe@10 = gleam@list:map( _pipe@2, fun(X) -> {Module, Imports} = X, Alias@1 = begin _pipe@3 = Imports, _pipe@4 = gleam@list:map( _pipe@3, fun(I@1) -> erlang:element(3, I@1) end ), _pipe@5 = gleam@option:values(_pipe@4), (fun(Aliases) -> case gleam@list:unique(Aliases) of [] -> none; [Alias] -> {some, Alias}; _ -> erlang:error(#{gleam_error => panic, message => begin gleam@io:debug(Aliases), <<<<"0 or 1 aliases allowed, but for module `"/utf8, Module/binary>>/binary, "` multiple aliases found (see above)"/utf8>> end, module => <<"deriv"/utf8>>, function => <<"consolidate_imports"/utf8>>, line => 469}) end end)(_pipe@5) end, Unqualified_types = begin _pipe@6 = Imports, _pipe@7 = gleam@list:flat_map( _pipe@6, fun(I@2) -> erlang:element(4, I@2) end ), gleam@list:unique(_pipe@7) end, Unqualified_values = begin _pipe@8 = Imports, _pipe@9 = gleam@list:flat_map( _pipe@8, fun(I@3) -> erlang:element(5, I@3) end ), gleam@list:unique(_pipe@9) end, {import, Module, Alias@1, Unqualified_types, Unqualified_values} end ), gleam@list:sort( _pipe@10, fun(A, B) -> gleam@string:compare(erlang:element(2, A), erlang:element(2, B)) end ). -file("src/deriv.gleam", 496). -spec unqualified_import_str(glance:unqualified_import(), boolean()) -> binary(). unqualified_import_str(Uqi, Is_type) -> Type_ = case Is_type of true -> <<"type "/utf8>>; false -> <<""/utf8>> end, Alias@1 = case erlang:element(3, Uqi) of {some, Alias} -> <<" as "/utf8, Alias/binary>>; none -> <<""/utf8>> end, <<<>/binary, Alias@1/binary>>. -file("src/deriv.gleam", 512). -spec import_src(glance:import()) -> binary(). import_src(I) -> Alias = case erlang:element(3, I) of {some, {named, Name}} -> <<"as "/utf8, Name/binary>>; {some, {discarded, Name@1}} -> <<"as _"/utf8, Name@1/binary>>; none -> <<""/utf8>> end, Types = begin _pipe = erlang:element(4, I), _pipe@1 = gleam@list:sort( _pipe, fun(A, B) -> gleam@string:compare(erlang:element(2, A), erlang:element(2, B)) end ), gleam@list:map( _pipe@1, fun(_capture) -> unqualified_import_str(_capture, true) end ) end, Funcs = begin _pipe@2 = erlang:element(5, I), _pipe@3 = gleam@list:sort( _pipe@2, fun(A@1, B@1) -> gleam@string:compare( erlang:element(2, A@1), erlang:element(2, B@1) ) end ), gleam@list:map( _pipe@3, fun(_capture@1) -> unqualified_import_str(_capture@1, false) end ) end, Types_and_constructors = case lists:append(Types, Funcs) of [] -> <<""/utf8>>; Xs -> Str = gleam@string:join(Xs, <<", "/utf8>>), <<<<".{"/utf8, Str/binary>>/binary, "}"/utf8>> end, Module_with_types_and_constructors = <<(erlang:element(2, I))/binary, Types_and_constructors/binary>>, _pipe@4 = [<<"import"/utf8>>, Module_with_types_and_constructors, Alias], _pipe@5 = gleam@list:filter(_pipe@4, fun(Str@1) -> Str@1 /= <<""/utf8>> end), gleam@string:join(_pipe@5, <<" "/utf8>>). -file("src/deriv.gleam", 415). -spec consolidate_imports_for(binary(), list(glance:import())) -> binary(). consolidate_imports_for(Src, Add_imports) -> _assert_subject = case glance:module(Src) of {error, Err} -> gleam@io:debug(Err), gleam_stdlib:println(Src), erlang:error(#{gleam_error => panic, message => <<"Failed to parse the above source with `glance.module`"/utf8>>, module => <<"deriv"/utf8>>, function => <<"consolidate_imports_for"/utf8>>, line => 421}); Ok -> Ok end, {ok, Module} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"consolidate_imports_for"/utf8>>, line => 416}) end, Curr_imports = begin _pipe = erlang:element(2, Module), gleam@list:map(_pipe, fun(D) -> erlang:element(3, D) end) end, New_imports = begin _pipe@1 = [Curr_imports, Add_imports], _pipe@2 = gleam@list:flatten(_pipe@1), _pipe@3 = consolidate_imports(_pipe@2), _pipe@4 = gleam@list:map(_pipe@3, fun import_src/1), _pipe@5 = gleam@string:join(_pipe@4, <<"\n"/utf8>>), gleam@string:trim(_pipe@5) end, Src_without_imports = begin _pipe@6 = Src, _pipe@7 = gleam@string:split(_pipe@6, <<"\n"/utf8>>), _pipe@8 = lists:reverse(_pipe@7), _pipe@9 = gleam@list:take_while( _pipe@8, fun(Str) -> not gleam_stdlib:string_starts_with(Str, <<"import"/utf8>>) end ), _pipe@10 = lists:reverse(_pipe@9), _pipe@11 = gleam@string:join(_pipe@10, <<"\n"/utf8>>), gleam@string:trim(_pipe@11) end, _pipe@12 = [New_imports, Src_without_imports], gleam@string:join(_pipe@12, <<"\n\n"/utf8>>). -file("src/deriv.gleam", 249). -spec build_same_file_writes(list(deriv@types:gen())) -> list(deriv@types:write()). build_same_file_writes(Xs) -> _pipe = Xs, _pipe@1 = gleam@list:group( _pipe, fun(Gen) -> erlang:element(2, erlang:element(2, Gen)) end ), _pipe@10 = gleam@dict:map_values( _pipe@1, fun(Module, Gens) -> Orig_src = begin _pipe@2 = Gens, _pipe@3 = gleam@list:first(_pipe@2), _pipe@4 = gleam@result:map( _pipe@3, fun(Gen@1) -> erlang:element(3, erlang:element(2, Gen@1)) end ), (fun(R) -> case R of {ok, Src} -> Src; {error, _} -> erlang:error(#{gleam_error => panic, message => (<<<<"`File.src` could not be found for `"/utf8, Module/binary>>/binary, "`"/utf8>>), module => <<"deriv"/utf8>>, function => <<"build_same_file_writes"/utf8>>, line => 262}) end end)(_pipe@4) end, Output_path = gleam_module_str_to_file_path(Module), Output = {output_inline, Module, Output_path}, Funcs = begin _pipe@5 = Gens, _pipe@6 = gleam@list:flat_map( _pipe@5, fun(Gen@2) -> erlang:element(5, Gen@2) end ), gleam@list:map( _pipe@6, fun(Func) -> {deriv@util:func_name(Func), deriv@util:func_str(Func)} end ) end, Module_imports = build_module_imports(Gens, Output), Deriv_imports = gleam@list:flat_map( Gens, fun(Gen@3) -> erlang:element(4, Gen@3) end ), All_imports = begin _pipe@7 = [Module_imports, Deriv_imports], gleam@list:flatten(_pipe@7) end, Func_src_with_imports = deriv@util:update_funcs(Orig_src, Funcs), Output_src = begin _pipe@8 = Func_src_with_imports, _pipe@9 = consolidate_imports_for(_pipe@8, All_imports), gleam@string:trim(_pipe@9) end, {write, Output_path, Output_src, Output} end ), maps:values(_pipe@10). -file("src/deriv.gleam", 349). -spec build_output_src(list(deriv@types:gen()), deriv@types:output()) -> binary(). build_output_src(Gens, Output) -> case Output of {output, _, _} -> Module_imports = build_module_imports(Gens, Output), Deriv_imports = gleam@list:flat_map( Gens, fun(Gen) -> erlang:element(4, Gen) end ), Defs = gleam@list:map( Gens, fun(Gen@1) -> erlang:element(6, Gen@1) end ), Func_src = gleam@string:join(Defs, <<"\n\n"/utf8>>), All_imports = begin _pipe = [Module_imports, Deriv_imports], gleam@list:flatten(_pipe) end, consolidate_imports_for(Func_src, All_imports); {output_inline, _, _} -> erlang:error(#{gleam_error => panic, message => <<"don't think this logic ever runs..."/utf8>>, module => <<"deriv"/utf8>>, function => <<"build_output_src"/utf8>>, line => 371}) end. -file("src/deriv.gleam", 294). -spec build_different_file_writes(list(deriv@types:gen())) -> list(deriv@types:write()). build_different_file_writes(Xs) -> _pipe = Xs, _pipe@1 = gleam@list:group( _pipe, fun(Gen) -> {output, erlang:element(2, erlang:element(2, Gen)), erlang:element(2, erlang:element(3, Gen))} end ), _pipe@4 = gleam@dict:map_values( _pipe@1, fun(Output, Gens) -> Output_path = output_path(Output), Output_src = begin _pipe@2 = Gens, _pipe@3 = build_output_src(_pipe@2, Output), gleam@string:trim(_pipe@3) end, {write, Output_path, Output_src, Output} end ), maps:values(_pipe@4). -file("src/deriv.gleam", 224). -spec build_writes(list(deriv@types:gen())) -> list(deriv@types:write()). build_writes(Xs) -> {Inline_derivs, Other_derivs} = begin _pipe = Xs, gleam@list:partition( _pipe, fun(Gen) -> _pipe@1 = erlang:element(7, Gen), _pipe@2 = gleam_stdlib:map_get(_pipe@1, <<"source"/utf8>>), _pipe@3 = gleam@result:map( _pipe@2, fun(Source) -> Source =:= <<"inline"/utf8>> end ), gleam@result:unwrap(_pipe@3, false) end ) end, Same_file_writes = begin _pipe@4 = Inline_derivs, build_same_file_writes(_pipe@4) end, Diff_file_writes = begin _pipe@5 = Other_derivs, build_different_file_writes(_pipe@5) end, _pipe@6 = [Diff_file_writes, Same_file_writes], gleam@list:flatten(_pipe@6). -file("src/deriv.gleam", 552). -spec stop_warning() -> binary(). stop_warning() -> gleam@io:debug(<<""/utf8>>). -file("src/deriv.gleam", 579). -spec load_types_from_file( glance:import(), list(deriv@types:derivation()), list(deriv@types:file()) ) -> {deriv@types:file(), list({glance:custom_type(), list(deriv@types:derivation()), gleam@dict:dict(deriv@types:deriv_field(), list(deriv@types:deriv_field_opt()))})}. load_types_from_file(Import_, Derivs, All_files) -> _assert_subject = gleam@list:find( All_files, fun(F) -> erlang:element(2, F) =:= erlang:element(2, Import_) end ), {ok, File} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"load_types_from_file"/utf8>>, line => 580}) end, _assert_subject@1 = glance:module(erlang:element(3, File)), {ok, Module} = case _assert_subject@1 of {ok, _} -> _assert_subject@1; _assert_fail@1 -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail@1, module => <<"deriv"/utf8>>, function => <<"load_types_from_file"/utf8>>, line => 581}) end, Type_names = begin _pipe = erlang:element(4, Import_), gleam@list:map(_pipe, fun(I) -> erlang:element(2, I) end) end, Types_and_derivs = begin _pipe@1 = erlang:element(3, Module), _pipe@2 = gleam@list:filter( _pipe@1, fun(T) -> gleam@list:contains( Type_names, erlang:element(2, erlang:element(3, T)) ) end ), gleam@list:map( _pipe@2, fun(T@1) -> {erlang:element(3, T@1), Derivs, maps:new()} end ) end, {File, Types_and_derivs}. -file("src/deriv.gleam", 611). -spec suppress_warnings_types_to_write(glance:module_()) -> list(binary()). suppress_warnings_types_to_write(Module) -> Import_types = begin _pipe = erlang:element(2, Module), gleam@list:flat_map( _pipe, fun(I) -> _pipe@1 = erlang:element(4, erlang:element(3, I)), gleam@list:map(_pipe@1, fun(T) -> erlang:element(2, T) end) end ) end, Type_aliases = begin _pipe@2 = erlang:element(4, Module), gleam@list:map( _pipe@2, fun(Ta) -> erlang:element(2, erlang:element(3, Ta)) end ) end, _pipe@3 = Import_types, gleam@list:filter( _pipe@3, fun(T@1) -> not gleam@list:contains( Type_aliases, <<"SuppressWarnings"/utf8, T@1/binary>> ) end ). -file("src/deriv.gleam", 597). -spec write_suppress_warning_type_aliases_to_file(glance:module_()) -> nil. write_suppress_warning_type_aliases_to_file(Module) -> Src = begin _pipe = Module, _pipe@1 = suppress_warnings_types_to_write(_pipe), _pipe@2 = gleam@list:map( _pipe@1, fun(T) -> <<<<<<"pub type SuppressWarnings"/utf8, T/binary>>/binary, " = "/utf8>>/binary, T/binary>> end ), gleam@string:join(_pipe@2, <<"\n"/utf8>>) end, Project_derivs_filepath = <<<<"src/"/utf8, (project_name())/binary>>/binary, "/derivs.gleam"/utf8>>, _assert_subject = simplifile:append(Project_derivs_filepath, Src), {ok, _} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"write_suppress_warning_type_aliases_to_file"/utf8>>, line => 606}) end, nil. -file("src/deriv.gleam", 557). -spec derivs_file_import_gens( deriv@types:file(), list(deriv@types:file()), gleam@dict:dict(binary(), fun((glance:custom_type(), deriv@types:derivation(), gleam@dict:dict(deriv@types:deriv_field(), list(deriv@types:deriv_field_opt())), deriv@types:file(), fun((binary()) -> {ok, glance:module_()} | {error, deriv@types:module_reader_err()})) -> deriv@types:gen())) ) -> list(deriv@types:gen()). derivs_file_import_gens(Derivs_file, All_files, Gen_funcs) -> _assert_subject = glance:module(erlang:element(3, Derivs_file)), {ok, Module} = case _assert_subject of {ok, _} -> _assert_subject; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, value => _assert_fail, module => <<"deriv"/utf8>>, function => <<"derivs_file_import_gens"/utf8>>, line => 562}) end, write_suppress_warning_type_aliases_to_file(Module), _pipe = erlang:element(2, Module), _pipe@1 = gleam@list:map(_pipe, fun(I) -> erlang:element(3, I) end), _pipe@2 = gleam@list:map( _pipe@1, fun(_capture) -> deriv@parser:parse_import_with_derivations( _capture, erlang:element(3, Derivs_file) ) end ), _pipe@3 = gleam@result:values(_pipe@2), gleam@list:flat_map( _pipe@3, fun(X) -> {Import_, Derivs} = X, {File, Types_and_derivs} = load_types_from_file( Import_, Derivs, All_files ), _pipe@4 = Types_and_derivs, gleam@list:flat_map( _pipe@4, fun(_capture@1) -> gen_type_derivs( _capture@1, File, Gen_funcs, fun deriv@util:fetch_module/1 ) end ) end ). -file("src/deriv.gleam", 119). -spec gen_derivs( list(deriv@types:file()), fun((binary()) -> {ok, glance:module_()} | {error, deriv@types:module_reader_err()}) ) -> list(deriv@types:gen()). gen_derivs(Files, Module_reader) -> Gen_funcs = begin _pipe = [{<<"json"/utf8>>, fun deriv@json:gen/5}, {<<"unify"/utf8>>, fun deriv@unify:gen/5}], maps:from_list(_pipe) end, Project_derivs_module_name = <<(project_name())/binary, "/derivs"/utf8>>, Type_inline_gens = begin _pipe@1 = Files, _pipe@2 = gleam@list:filter( _pipe@1, fun(File) -> erlang:element(2, File) /= Project_derivs_module_name end ), _pipe@5 = gleam@list:map( _pipe@2, fun(File@1) -> File@2 = begin _record = File@1, {file, erlang:element(2, _record), erlang:element(3, _record), none} end, _pipe@3 = File@2, _pipe@4 = parse_types_and_derivations(_pipe@3), gleam@list:flat_map( _pipe@4, fun(_capture) -> gen_type_derivs( _capture, File@2, Gen_funcs, Module_reader ) end ) end ), _pipe@6 = gleam@list:flatten(_pipe@5), gleam@list:map(_pipe@6, fun(Gen) -> _record@1 = Gen, {gen, erlang:element(2, _record@1), erlang:element(3, _record@1), erlang:element(4, _record@1), erlang:element(5, _record@1), erlang:element(6, _record@1), maps:from_list([{<<"source"/utf8>>, <<"inline"/utf8>>}])} end) end, Derivs_file = gleam@list:find( Files, fun(File@3) -> erlang:element(2, File@3) =:= Project_derivs_module_name end ), Derivs_file_import_gens = begin _pipe@7 = case Derivs_file of {ok, File@4} -> derivs_file_import_gens(File@4, Files, Gen_funcs); _ -> [] end, gleam@list:map(_pipe@7, fun(Gen@1) -> _record@2 = Gen@1, {gen, erlang:element(2, _record@2), erlang:element(3, _record@2), erlang:element(4, _record@2), erlang:element(5, _record@2), erlang:element(6, _record@2), maps:from_list([{<<"source"/utf8>>, <<"import"/utf8>>}])} end) end, _pipe@8 = [Type_inline_gens, Derivs_file_import_gens], gleam@list:flatten(_pipe@8). -file("src/deriv.gleam", 70). -spec main() -> nil. main() -> Filepaths = find_project_src_gleam_filepaths(), _pipe = Filepaths, _pipe@1 = load_files(_pipe), _pipe@2 = gen_derivs(_pipe@1, fun deriv@util:fetch_module/1), _pipe@3 = build_writes(_pipe@2), perform_file_writes(_pipe@3).