Packages

Gleam DNS-SD discovery on Erlang

Current section

Files

Jump to
esdee src esdee@internal@dispatcher.erl
Raw

src/esdee@internal@dispatcher.erl

-module(esdee@internal@dispatcher).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/esdee/internal/dispatcher.gleam").
-export([new/0, subscribe_to_service_types/2, unsubscribe_from_service_types/2, subscribe_to_service_details/3, unsubscribe_from_service_details/3, dispatch/2]).
-export_type([dispatcher/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(false).
-opaque dispatcher() :: {dispatcher,
gleam@set:set(fun((binary()) -> nil)),
gleam@dict:dict(binary(), gleam@set:set(fun((esdee:service_description()) -> nil)))}.
-file("src/esdee/internal/dispatcher.gleam", 19).
?DOC(false).
-spec new() -> dispatcher().
new() ->
{dispatcher, gleam@set:new(), maps:new()}.
-file("src/esdee/internal/dispatcher.gleam", 26).
?DOC(false).
-spec subscribe_to_service_types(dispatcher(), fun((binary()) -> nil)) -> dispatcher().
subscribe_to_service_types(Dispatcher, Callback) ->
Service_type_callbacks = begin
_pipe = erlang:element(2, Dispatcher),
gleam@set:insert(_pipe, Callback)
end,
{dispatcher, Service_type_callbacks, erlang:element(3, Dispatcher)}.
-file("src/esdee/internal/dispatcher.gleam", 38).
?DOC(false).
-spec unsubscribe_from_service_types(dispatcher(), fun((binary()) -> nil)) -> dispatcher().
unsubscribe_from_service_types(Dispatcher, Callback) ->
Service_type_callbacks = begin
_pipe = erlang:element(2, Dispatcher),
gleam@set:delete(_pipe, Callback)
end,
{dispatcher, Service_type_callbacks, erlang:element(3, Dispatcher)}.
-file("src/esdee/internal/dispatcher.gleam", 50).
?DOC(false).
-spec subscribe_to_service_details(
dispatcher(),
binary(),
fun((esdee:service_description()) -> nil)
) -> dispatcher().
subscribe_to_service_details(Dispatcher, Service_type, Callback) ->
Service_detail_callbacks = begin
_pipe = erlang:element(3, Dispatcher),
gleam@dict:upsert(
_pipe,
Service_type,
fun(Existing) -> _pipe@1 = case Existing of
{some, Existing@1} ->
Existing@1;
none ->
gleam@set:new()
end,
gleam@set:insert(_pipe@1, Callback) end
)
end,
{dispatcher, erlang:element(2, Dispatcher), Service_detail_callbacks}.
-file("src/esdee/internal/dispatcher.gleam", 68).
?DOC(false).
-spec unsubscribe_from_service_details(
dispatcher(),
binary(),
fun((esdee:service_description()) -> nil)
) -> dispatcher().
unsubscribe_from_service_details(Dispatcher, Service_type, Callback) ->
Callbacks_dict = erlang:element(3, Dispatcher),
Service_detail_callbacks = case gleam_stdlib:map_get(
Callbacks_dict,
Service_type
) of
{error, _} ->
Callbacks_dict;
{ok, Callbacks} ->
Callbacks@1 = gleam@set:delete(Callbacks, Callback),
_pipe = Callbacks_dict,
case gleam@set:is_empty(Callbacks@1) of
true ->
fun(_capture) ->
gleam@dict:delete(_capture, Service_type)
end;
false ->
fun(_capture@1) ->
gleam@dict:insert(_capture@1, Service_type, Callbacks@1)
end
end(_pipe)
end,
{dispatcher, erlang:element(2, Dispatcher), Service_detail_callbacks}.
-file("src/esdee/internal/dispatcher.gleam", 89).
?DOC(false).
-spec dispatch(dispatcher(), esdee:service_discvery_update()) -> nil.
dispatch(Dispatcher, Update) ->
case Update of
{service_type_discovered, Service_type} ->
gleam@set:each(
erlang:element(2, Dispatcher),
fun(Callback) -> Callback(Service_type) end
);
{service_discovered, Description} ->
case gleam_stdlib:map_get(
erlang:element(3, Dispatcher),
erlang:element(2, Description)
) of
{ok, Callbacks} ->
gleam@set:each(
Callbacks,
fun(Callback@1) -> Callback@1(Description) end
);
{error, _} ->
nil
end
end.