Current section
Files
Jump to
Current section
Files
src/glixir@registry.erl
-module(glixir@registry).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glixir/registry.gleam").
-export([start_registry/2, start_unique_registry/1, register_subject/4, lookup_subject/3, register_subject_string/3, lookup_subject_string/2, unregister_subject_string/2, unregister_subject/3, atom_key_encoder/1, string_key_encoder/1, int_key_encoder/1, user_id_encoder/1, session_key_encoder/1]).
-export_type([registry/2, registry_keys/0, registry_error/0, registry_start_result/0, registry_register_result/0, registry_lookup_result/1, registry_unregister_result/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(
" Type-safe, phantom-typed Registry for Gleam/Elixir interop\n"
"\n"
" This module provides a *phantom-typed* interface to Elixir Registry.\n"
" All registries are parameterized by their `key_type` and `message_type`,\n"
" so misuse is a compile error, not a runtime surprise.\n"
).
-opaque registry(EQW, EQX) :: {registry, gleam@erlang@process:pid_()} |
{gleam_phantom, EQW, EQX}.
-type registry_keys() :: unique | duplicate.
-type registry_error() :: {start_error, binary()} |
{register_error, binary()} |
{lookup_error, binary()} |
{unregister_error, binary()} |
already_exists |
not_found.
-type registry_start_result() :: {registry_start_ok,
gleam@erlang@process:pid_()} |
{registry_start_error, gleam@dynamic:dynamic_()}.
-type registry_register_result() :: registry_register_ok |
{registry_register_error, gleam@dynamic:dynamic_()}.
-type registry_lookup_result(EQY) :: {registry_lookup_ok,
gleam@erlang@process:subject(EQY)} |
registry_lookup_not_found |
{registry_lookup_error, gleam@dynamic:dynamic_()}.
-type registry_unregister_result() :: registry_unregister_ok |
{registry_unregister_error, gleam@dynamic:dynamic_()}.
-file("src/glixir/registry.gleam", 82).
-spec keys_to_string(registry_keys()) -> binary().
keys_to_string(Keys) ->
case Keys of
unique ->
<<"unique"/utf8>>;
duplicate ->
<<"duplicate"/utf8>>
end.
-file("src/glixir/registry.gleam", 96).
?DOC(" Start a phantom-typed registry with bounded key and message types\n").
-spec start_registry(gleam@erlang@atom:atom_(), registry_keys()) -> {ok,
registry(any(), any())} |
{error, registry_error()}.
start_registry(Name, Keys) ->
glixir@utils:debug_log_with_prefix(
debug,
<<"registry"/utf8>>,
<<"Starting registry: "/utf8, (erlang:atom_to_binary(Name))/binary>>
),
case 'Elixir.Glixir.Registry':start_registry(
erlang:atom_to_binary(Name),
keys_to_string(Keys)
) of
{registry_start_ok, Pid} ->
glixir@utils:debug_log_with_prefix(
info,
<<"registry"/utf8>>,
<<"Registry started successfully"/utf8>>
),
{ok, {registry, Pid}};
{registry_start_error, Reason} ->
glixir@utils:debug_log_with_prefix(
error,
<<"registry"/utf8>>,
<<"Registry start failed"/utf8>>
),
{error, {start_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/registry.gleam", 127).
?DOC(" Start a unique key registry (most common use case)\n").
-spec start_unique_registry(gleam@erlang@atom:atom_()) -> {ok,
registry(any(), any())} |
{error, registry_error()}.
start_unique_registry(Name) ->
start_registry(Name, unique).
-file("src/glixir/registry.gleam", 134).
?DOC(" Register a Subject with a typed key in the phantom-typed registry\n").
-spec register_subject(
gleam@erlang@atom:atom_(),
ERQ,
gleam@erlang@process:subject(any()),
fun((ERQ) -> binary())
) -> {ok, nil} | {error, registry_error()}.
register_subject(Registry_name, Key, Subject, Encode_key) ->
glixir@utils:debug_log_with_prefix(
debug,
<<"registry"/utf8>>,
<<"Registering subject with key"/utf8>>
),
case 'Elixir.Glixir.Registry':register_subject(
erlang:atom_to_binary(Registry_name),
Encode_key(Key),
Subject
) of
registry_register_ok ->
glixir@utils:debug_log_with_prefix(
info,
<<"registry"/utf8>>,
<<"Subject registered successfully"/utf8>>
),
{ok, nil};
{registry_register_error, Reason} ->
glixir@utils:debug_log_with_prefix(
error,
<<"registry"/utf8>>,
<<"Subject registration failed"/utf8>>
),
{error, {register_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/registry.gleam", 173).
?DOC(" Look up a Subject by typed key in the phantom-typed registry\n").
-spec lookup_subject(gleam@erlang@atom:atom_(), ERW, fun((ERW) -> binary())) -> {ok,
gleam@erlang@process:subject(any())} |
{error, registry_error()}.
lookup_subject(Registry_name, Key, Encode_key) ->
glixir@utils:debug_log_with_prefix(
debug,
<<"registry"/utf8>>,
<<"Looking up subject by key"/utf8>>
),
case 'Elixir.Glixir.Registry':lookup_subject(
erlang:atom_to_binary(Registry_name),
Encode_key(Key)
) of
{registry_lookup_ok, Subject} ->
glixir@utils:debug_log_with_prefix(
info,
<<"registry"/utf8>>,
<<"Subject found successfully"/utf8>>
),
{ok, Subject};
registry_lookup_not_found ->
glixir@utils:debug_log_with_prefix(
warning,
<<"registry"/utf8>>,
<<"Subject not found"/utf8>>
),
{error, not_found};
{registry_lookup_error, Reason} ->
glixir@utils:debug_log_with_prefix(
error,
<<"registry"/utf8>>,
<<"Subject lookup failed"/utf8>>
),
{error, {lookup_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/registry.gleam", 213).
?DOC(" SAFE: Register with string key (no dynamic atom creation)\n").
-spec register_subject_string(
gleam@erlang@atom:atom_(),
binary(),
gleam@erlang@process:subject(any())
) -> {ok, nil} | {error, registry_error()}.
register_subject_string(Registry_name, Key, Subject) ->
case 'Elixir.Glixir.Registry':register_subject(
erlang:atom_to_binary(Registry_name),
Key,
Subject
) of
registry_register_ok ->
{ok, nil};
{registry_register_error, Reason} ->
{error, {register_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/registry.gleam", 227).
?DOC(" SAFE: Lookup with string key\n").
-spec lookup_subject_string(gleam@erlang@atom:atom_(), binary()) -> {ok,
gleam@erlang@process:subject(any())} |
{error, registry_error()}.
lookup_subject_string(Registry_name, Key) ->
case 'Elixir.Glixir.Registry':lookup_subject(
erlang:atom_to_binary(Registry_name),
Key
) of
{registry_lookup_ok, Subject} ->
{ok, Subject};
registry_lookup_not_found ->
{error, not_found};
{registry_lookup_error, Reason} ->
{error, {lookup_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/registry.gleam", 239).
?DOC(" SAFE: Unregister with string key\n").
-spec unregister_subject_string(gleam@erlang@atom:atom_(), binary()) -> {ok,
nil} |
{error, registry_error()}.
unregister_subject_string(Registry_name, Key) ->
case 'Elixir.Glixir.Registry':unregister_subject(
erlang:atom_to_binary(Registry_name),
Key
) of
registry_unregister_ok ->
{ok, nil};
{registry_unregister_error, Reason} ->
{error, {unregister_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/registry.gleam", 251).
?DOC(" Unregister a key from the phantom-typed registry\n").
-spec unregister_subject(gleam@erlang@atom:atom_(), ESM, fun((ESM) -> binary())) -> {ok,
nil} |
{error, registry_error()}.
unregister_subject(Registry_name, Key, Encode_key) ->
glixir@utils:debug_log_with_prefix(
debug,
<<"registry"/utf8>>,
<<"Unregistering subject"/utf8>>
),
case 'Elixir.Glixir.Registry':unregister_subject(
erlang:atom_to_binary(Registry_name),
Encode_key(Key)
) of
registry_unregister_ok ->
glixir@utils:debug_log_with_prefix(
info,
<<"registry"/utf8>>,
<<"Subject unregistered successfully"/utf8>>
),
{ok, nil};
{registry_unregister_error, Reason} ->
glixir@utils:debug_log_with_prefix(
error,
<<"registry"/utf8>>,
<<"Subject unregistration failed"/utf8>>
),
{error, {unregister_error, gleam@string:inspect(Reason)}}
end.
-file("src/glixir/registry.gleam", 285).
?DOC(" Encoder for Atom keys (most common case)\n").
-spec atom_key_encoder(gleam@erlang@atom:atom_()) -> binary().
atom_key_encoder(Key) ->
erlang:atom_to_binary(Key).
-file("src/glixir/registry.gleam", 290).
?DOC(" Encoder for String keys\n").
-spec string_key_encoder(binary()) -> binary().
string_key_encoder(Key) ->
Key.
-file("src/glixir/registry.gleam", 295).
?DOC(" Encoder for Int keys\n").
-spec int_key_encoder(integer()) -> binary().
int_key_encoder(Key) ->
erlang:integer_to_binary(Key).
-file("src/glixir/registry.gleam", 300).
?DOC(" Encoder for user ID keys (common pattern)\n").
-spec user_id_encoder(integer()) -> binary().
user_id_encoder(User_id) ->
<<"user_"/utf8, (erlang:integer_to_binary(User_id))/binary>>.
-file("src/glixir/registry.gleam", 305).
?DOC(" Encoder for session keys (common pattern)\n").
-spec session_key_encoder(binary()) -> binary().
session_key_encoder(Session_id) ->
<<"session_"/utf8, Session_id/binary>>.