-module(pharos@event_bus).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/pharos/event_bus.gleam").
-export([from_name/1, start_link/1, notify/2, add_handler/2, remove_handler/2]).
-export_type([event_bus/0, handler_id/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(
" The alert event bus.\n"
"\n"
" A thin, restart-resilient wrapper around an `eparch/event_manager`\n"
" configured with a registered name. The wrapper holds the `Name`, not\n"
" a `Pid` or `Manager` value, so handles stay valid across supervisor\n"
" restarts: when the underlying gen_event process is restarted under\n"
" the same registered name, every previously-issued `EventBus` handle\n"
" keeps working transparently.\n"
"\n"
" Most callers should not interact with `EventBus` directly: it is\n"
" constructed by the pharos supervisor and exposed indirectly via\n"
" `pharos.subscribe` / `pharos.unsubscribe`.\n"
).
-opaque event_bus() :: {event_bus,
gleam@erlang@process:name(pharos@alert:alert_event())}.
-opaque handler_id() :: {handler_id, eparch@event_manager:handler_ref(nil, nil)}.
-file("src/pharos/event_bus.gleam", 38).
?DOC(
" Wrap a registered name as an `EventBus`. The name must already (or\n"
" eventually) be registered to a running `gen_event` manager process;\n"
" the wrapper resolves it lazily on every API call.\n"
).
-spec from_name(gleam@erlang@process:name(pharos@alert:alert_event())) -> event_bus().
from_name(Name) ->
{event_bus, Name}.
-file("src/pharos/event_bus.gleam", 47).
?DOC(
" Start a fresh event bus registered under `name`.\n"
"\n"
" Used by the supervisor's bus child. The returned `Pid` is the bus's\n"
" process id (suitable for `actor.Started`); the bus is also registered\n"
" under `name` so other processes can reach it after a restart.\n"
).
-spec start_link(gleam@erlang@process:name(pharos@alert:alert_event())) -> {ok,
{gleam@erlang@process:pid_(), event_bus()}} |
{error, eparch@event_manager:start_error()}.
start_link(Name) ->
Options = begin
_pipe = eparch@event_manager:new_start_options(),
eparch@event_manager:with_name(_pipe, {local, Name})
end,
_pipe@1 = eparch@event_manager:start_link(Options),
gleam@result:map(
_pipe@1,
fun(Manager) ->
{eparch@event_manager:manager_pid(Manager), {event_bus, Name}}
end
).
-file("src/pharos/event_bus.gleam", 90).
?DOC(
" Resolve the bus's `Name(AlertEvent)` to an eparch `Manager(AlertEvent)`.\n"
" At the Erlang level both are interchangeable references that gen_event\n"
" resolves at call time, so the FFI shim is an identity function on the\n"
" underlying atom.\n"
).
-spec manager_for(event_bus()) -> eparch@event_manager:manager(pharos@alert:alert_event()).
manager_for(Bus) ->
pharos_ffi:manager_from_name(erlang:element(2, Bus)).
-file("src/pharos/event_bus.gleam", 60).
?DOC(" Broadcast `event` to every registered handler. Non-blocking.\n").
-spec notify(event_bus(), pharos@alert:alert_event()) -> nil.
notify(Bus, Event) ->
eparch@event_manager:notify(manager_for(Bus), Event).
-file("src/pharos/event_bus.gleam", 65).
?DOC(" Register a Gleam function as an event handler on the bus.\n").
-spec add_handler(event_bus(), fun((pharos@alert:alert_event()) -> nil)) -> {ok,
handler_id()} |
{error, eparch@event_manager:add_error(nil, nil)}.
add_handler(Bus, Handler) ->
Handler_spec = eparch@event_manager:new_handler(
nil,
fun(Event, _) ->
Handler(Event),
{continue, nil}
end
),
_pipe = eparch@event_manager:add_handler(manager_for(Bus), Handler_spec),
gleam@result:map(_pipe, fun(Field@0) -> {handler_id, Field@0} end).
-file("src/pharos/event_bus.gleam", 79).
?DOC(" Unregister a previously added handler.\n").
-spec remove_handler(event_bus(), handler_id()) -> {ok, nil} |
{error, eparch@event_manager:remove_error(nil, nil)}.
remove_handler(Bus, Id) ->
eparch@event_manager:remove_handler(manager_for(Bus), erlang:element(2, Id)).