Skip to main content

src/proute.erl

-module(proute).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/proute.gleam").
-export([run_config/1, main/0]).
-export_type([generated_mount/0, generated_file/0, proute_error/0]).

-type generated_mount() :: {generated_mount, list(generated_file())}.

-type generated_file() :: {generated_file, binary(), binary()}.

-type proute_error() :: {config_error, proute@config:config_error()} |
    {discovery_error, proute@discover:discover_error()} |
    {validation_errors, list(proute@validate@pages:validation_error())} |
    {write_error, binary()}.

-file("src/proute.gleam", 137).
-spec describe_error(proute_error()) -> binary().
describe_error(Error) ->
    case Error of
        {config_error, Error@1} ->
            proute@config:describe_error(Error@1);

        {discovery_error, Error@2} ->
            proute@discover:describe_error(Error@2);

        {validation_errors, Errors} ->
            _pipe = Errors,
            _pipe@1 = gleam@list:map(
                _pipe,
                fun proute@validate@pages:describe_error/1
            ),
            gleam@string:join(_pipe@1, <<"\n"/utf8>>);

        {write_error, Path} ->
            <<<<"Could not write generated file "/utf8,
                    (gleam@string:inspect(Path))/binary>>/binary,
                "."/utf8>>
    end.

-file("src/proute.gleam", 127).
-spec write_file(binary(), binary()) -> {ok, nil} | {error, proute_error()}.
write_file(Path, Contents) ->
    gleam@result:'try'(
        begin
            _pipe = simplifile:create_directory_all(
                filepath:directory_name(Path)
            ),
            gleam@result:map_error(_pipe, fun(_) -> {write_error, Path} end)
        end,
        fun(_) -> _pipe@1 = simplifile:write(Path, Contents),
            gleam@result:map_error(_pipe@1, fun(_) -> {write_error, Path} end) end
    ).

-file("src/proute.gleam", 113).
-spec write_all(list(generated_file())) -> {ok, list(generated_file())} |
    {error, proute_error()}.
write_all(Files) ->
    gleam@result:'try'(
        begin
            _pipe = Files,
            gleam@list:try_map(
                _pipe,
                fun(File) ->
                    {generated_file, Path, Contents} = File,
                    write_file(Path, Contents)
                end
            )
        end,
        fun(_) -> {ok, Files} end
    ).

-file("src/proute.gleam", 81).
-spec generate_mount(proute@config:mount()) -> {ok, generated_mount()} |
    {error, proute_error()}.
generate_mount(Mount) ->
    gleam@result:'try'(
        begin
            _pipe = proute@discover:discover_mount(Mount),
            gleam@result:map_error(
                _pipe,
                fun(Field@0) -> {discovery_error, Field@0} end
            )
        end,
        fun(Mount_routes) ->
            gleam@result:'try'(
                begin
                    _pipe@1 = proute@validate@pages:validate_mount(Mount_routes),
                    gleam@result:map_error(
                        _pipe@1,
                        fun(Field@0) -> {validation_errors, Field@0} end
                    )
                end,
                fun(Page_modules) ->
                    {ok,
                        {generated_mount,
                            [{generated_file,
                                    erlang:element(6, Mount),
                                    proute@generate@routes:generate(
                                        Mount_routes
                                    )},
                                {generated_file,
                                    erlang:element(8, Mount),
                                    proute@generate@page_input:generate(
                                        Mount_routes
                                    )},
                                {generated_file,
                                    erlang:element(7, Mount),
                                    proute@generate@pages:generate(
                                        Mount_routes,
                                        Page_modules,
                                        erlang:element(10, Mount)
                                    )}]}}
                end
            )
        end
    ).

-file("src/proute.gleam", 70).
-spec generate_all(proute@config:config()) -> {ok, list(generated_file())} |
    {error, proute_error()}.
generate_all(Config) ->
    gleam@result:'try'(
        begin
            _pipe = erlang:element(4, Config),
            gleam@list:try_map(_pipe, fun generate_mount/1)
        end,
        fun(Generated) ->
            {ok,
                begin
                    _pipe@1 = Generated,
                    gleam@list:flat_map(
                        _pipe@1,
                        fun(Mount) -> erlang:element(2, Mount) end
                    )
                end}
        end
    ).

-file("src/proute.gleam", 50).
-spec run_config(proute@config:config()) -> {ok, list(generated_file())} |
    {error, proute_error()}.
run_config(Config) ->
    gleam@result:'try'(
        generate_all(Config),
        fun(Generated) ->
            gleam@result:'try'(
                write_all(Generated),
                fun(Files) -> {ok, Files} end
            )
        end
    ).

-file("src/proute.gleam", 157).
-spec find_config_path_from(binary()) -> {ok, binary()} | {error, nil}.
find_config_path_from(Directory) ->
    Path = <<Directory/binary, "/proute.toml"/utf8>>,
    case simplifile_erl:is_file(Path) of
        {ok, true} ->
            {ok, Path};

        _ ->
            Parent = filepath:directory_name(Directory),
            case Parent =:= Directory of
                true ->
                    {error, nil};

                false ->
                    find_config_path_from(Parent)
            end
    end.

-file("src/proute.gleam", 150).
-spec find_config_path() -> {ok, binary()} | {error, nil}.
find_config_path() ->
    case simplifile:current_directory() of
        {ok, Directory} ->
            find_config_path_from(Directory);

        {error, _} ->
            {error, nil}
    end.

-file("src/proute.gleam", 59).
-spec load() -> {ok, proute@config:config()} |
    {error, proute@config:config_error()}.
load() ->
    case find_config_path() of
        {ok, Path} ->
            case simplifile:read(Path) of
                {ok, Source} ->
                    proute@config:parse(Source);

                {error, _} ->
                    {error, {missing_config, Path}}
            end;

        {error, _} ->
            {error, {missing_config, <<"proute.toml"/utf8>>}}
    end.

-file("src/proute.gleam", 45).
-spec run() -> {ok, list(generated_file())} | {error, proute_error()}.
run() ->
    gleam@result:'try'(
        begin
            _pipe = load(),
            gleam@result:map_error(
                _pipe,
                fun(Field@0) -> {config_error, Field@0} end
            )
        end,
        fun(Config) -> run_config(Config) end
    ).

-file("src/proute.gleam", 30).
-spec main() -> nil.
main() ->
    case run() of
        {ok, Files} ->
            _pipe = Files,
            gleam@list:each(
                _pipe,
                fun(File) ->
                    {generated_file, Path, _} = File,
                    gleam_stdlib:println(<<"Generated "/utf8, Path/binary>>)
                end
            );

        {error, Error} ->
            gleam_stdlib:println_error(describe_error(Error)),
            proute@exit:failure()
    end.