Current section

Files

Jump to
libero src libero.erl
Raw

src/libero.erl

-module(libero).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/libero.gleam").
-export([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(
" Message-type code generator.\n"
"\n"
" Scans the shared package source directory (configured via `--shared`)\n"
" for modules that export `MsgFromClient` or `MsgFromServer` custom types and\n"
" produces server dispatch, client send stubs, wire codec registration,\n"
" and atom pre-registration files. See the README for conventions and\n"
" usage.\n"
).
-file("src/libero.gleam", 65).
?DOC(
" Scan shared message modules, validate conventions, walk types, and\n"
" generate dispatch + client send stubs + register + atoms.\n"
).
-spec run(libero@config:config(), binary()) -> {ok, integer()} |
{error, list(libero@gen_error:gen_error())}.
run(Config, Shared_src) ->
gleam@result:'try'(
libero@scanner:scan_message_modules(Shared_src),
fun(_use0) ->
{Message_modules, Module_files} = _use0,
gleam_stdlib:println(
<<<<"libero: found "/utf8,
(erlang:integer_to_binary(
erlang:length(Message_modules)
))/binary>>/binary,
" message module(s)"/utf8>>
),
Server_src = gleam@option:unwrap(
erlang:element(12, Config),
<<"src"/utf8>>
),
gleam@result:'try'(
libero@scanner:validate_conventions(Message_modules, Server_src),
fun(Message_modules@1) ->
gleam@result:'try'(
libero@scanner:validate_msg_from_server_fields(
Message_modules@1
),
fun(_) ->
gleam@result:'try'(
libero@walker:walk_message_registry_types(
Message_modules@1,
Module_files
),
fun(Discovered) ->
gleam_stdlib:println(
<<<<"libero: discovered "/utf8,
(erlang:integer_to_binary(
erlang:length(Discovered)
))/binary>>/binary,
" type variant(s) for registration"/utf8>>
),
gleam@result:'try'(
begin
_pipe = libero@codegen:write_dispatch(
Message_modules@1,
erlang:element(13, Config),
erlang:element(6, Config)
),
gleam@result:map_error(
_pipe,
fun(E) -> [E] end
)
end,
fun(_) ->
gleam@result:'try'(
libero@codegen:write_send_functions(
Message_modules@1,
erlang:element(14, Config)
),
fun(_) ->
gleam@result:'try'(
libero@codegen:write_push_wrappers(
Message_modules@1,
erlang:element(
13,
Config
)
),
fun(_) ->
gleam@result:'try'(
begin
_pipe@1 = libero@codegen:write_websocket(
erlang:element(
13,
Config
)
),
gleam@result:map_error(
_pipe@1,
fun(E@1) ->
[E@1]
end
)
end,
fun(_) ->
gleam@result:'try'(
begin
_pipe@2 = libero@codegen:write_config(
Config
),
gleam@result:map_error(
_pipe@2,
fun(
E@2
) ->
[E@2]
end
)
end,
fun(_) ->
gleam@result:'try'(
libero@codegen:write_register(
Config,
Discovered
),
fun(
_
) ->
gleam@result:'try'(
begin
_pipe@3 = libero@codegen:write_atoms(
Config,
Discovered
),
gleam@result:map_error(
_pipe@3,
fun(
E@3
) ->
[E@3]
end
)
end,
fun(
_
) ->
{ok,
erlang:length(
Message_modules@1
)}
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/libero.gleam", 22).
-spec main() -> nil.
main() ->
nil = libero_ffi:trap_signals(),
Config = libero@config:parse_config(),
case erlang:element(11, Config) of
{some, Shared_src} ->
gleam_stdlib:println(
<<"libero: scanning shared message modules at "/utf8,
Shared_src/binary>>
),
case run(Config, Shared_src) of
{ok, Count} ->
gleam_stdlib:println(
<<<<"libero: done. processed "/utf8,
(erlang:integer_to_binary(Count))/binary>>/binary,
" message module(s)"/utf8>>
),
_ = erlang:halt(0);
{error, Errors} ->
gleam@list:each(Errors, fun libero@gen_error:print_error/1),
Count@1 = erlang:integer_to_binary(erlang:length(Errors)),
gleam_stdlib:println_error(<<""/utf8>>),
gleam_stdlib:println_error(
<<<<"libero: "/utf8, Count@1/binary>>/binary,
" error(s), no files generated"/utf8>>
),
_ = erlang:halt(1)
end;
none ->
gleam_stdlib:println_error(<<"error: --shared is required"/utf8>>),
gleam_stdlib:println_error(<<""/utf8>>),
gleam_stdlib:println_error(<<" Example:"/utf8>>),
gleam_stdlib:println_error(
<<" gleam run -m libero -- --ws-path=/ws/admin --shared=../shared --server=."/utf8>>
),
_ = erlang:halt(1)
end.