-module(olive). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -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. -file("src/olive.gleam", 39). -spec listen_to_file_changes( gleam@erlang@process:subject(olive@watcher:message()), olive@client_registry:client_registry() ) -> any(). listen_to_file_changes(Subject, Clients) -> Msg = gleam_erlang_ffi:'receive'(Subject), case Msg of files_changed -> case olive@server_run:reload_server_code() of {ok, _} -> olive@client_registry:trigger(Clients); {error, Msg@1} -> olive@logging:error(Msg@1) end end, listen_to_file_changes(Subject, Clients). -file("src/olive.gleam", 26). -spec run_olive(olive@config:config()) -> any(). run_olive(Config) -> olive@logging:configure_logs(erlang:element(5, Config)), Clients = olive@client_registry:start(), Subject = gleam@erlang@process:new_subject(), _assert_subject = olive@watcher:start(Subject), {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 => <<"olive"/utf8>>, function => <<"run_olive"/utf8>>, line => 31}) end, _ = olive@server_run:start_server(), _assert_subject@1 = olive@proxy:start_http(Config, Clients), {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 => <<"olive"/utf8>>, function => <<"run_olive"/utf8>>, line => 34}) end, listen_to_file_changes(Subject, Clients). -file("src/olive.gleam", 16). ?DOC( " Process is as follow:\n" " - Start a client registry\n" " - Start watcher, giving it a subject we will listen to.\n" " - Every time watcher sends us a message:\n" " - Reload server code\n" " - Send reload message to clients\n" ). -spec main() -> nil. main() -> Config = olive@config:parse_from_cli(), case Config of {some, Config@1} -> run_olive(Config@1); none -> nil end.