Current section
Files
Jump to
Current section
Files
src/barnacle.erl
-module(barnacle).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([with_name/2, with_poll_interval/2, with_listener/2, with_connect_nodes_function/2, with_disconnect_nodes_function/2, with_list_nodes_function/2, refresh/2, pause/2, shutdown/2, run_once/1, start/1, child_spec/2, new_strategy/1, custom/1, local_epmd/0, epmd/1, dns/3, get_node_basename/1]).
-export_type([barnacle/1, strategy/1, node_disconnect_error/0, message/1, barnacle_response/1, state/1, refresh_error/1]).
-opaque barnacle(HRX) :: {barnacle,
gleam@option:option(gleam@erlang@atom:atom_()),
strategy(HRX),
integer(),
gleam@option:option(gleam@erlang@process:subject(barnacle_response(HRX)))}.
-opaque strategy(HRY) :: {strategy,
fun(() -> {ok, list(gleam@erlang@atom:atom_())} | {error, HRY}),
fun((list(gleam@erlang@atom:atom_())) -> {ok,
list(gleam@erlang@atom:atom_())} |
{error,
list({gleam@erlang@atom:atom_(),
gleam@erlang@node:connect_error()})}),
fun((list(gleam@erlang@atom:atom_())) -> {ok,
list(gleam@erlang@atom:atom_())} |
{error, list({gleam@erlang@atom:atom_(), node_disconnect_error()})}),
fun(() -> {ok, list(gleam@erlang@atom:atom_())} | {error, HRY})}.
-type node_disconnect_error() :: failed_to_disconnect | local_node_is_not_alive.
-opaque message(HRZ) :: {refresh,
gleam@option:option(gleam@erlang@process:subject({ok,
list(gleam@erlang@atom:atom_())} |
{error, refresh_error(HRZ)}))} |
{pause, gleam@option:option(gleam@erlang@process:subject(nil))} |
{shutdown, gleam@option:option(gleam@erlang@process:subject(nil))}.
-type barnacle_response(HSA) :: {refresh_response,
{ok, list(gleam@erlang@atom:atom_())} | {error, refresh_error(HSA)}} |
{pause_response, nil} |
{shutdown_response, nil}.
-type state(HSB) :: {state,
gleam@erlang@process:subject(message(HSB)),
barnacle(HSB),
gleam@option:option(gleam@erlang@process:timer())}.
-type refresh_error(HSC) :: {strategy_error, HSC} |
{connect_error,
list({gleam@erlang@atom:atom_(), gleam@erlang@node:connect_error()})} |
{disconnect_error,
list({gleam@erlang@atom:atom_(), node_disconnect_error()})}.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 38).
-spec with_name(barnacle(HSK), binary()) -> barnacle(HSK).
with_name(Barnacle, Name) ->
erlang:setelement(
2,
Barnacle,
{some,
begin
_pipe = Name,
erlang:binary_to_atom(_pipe)
end}
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 43).
-spec with_poll_interval(barnacle(HSN), integer()) -> barnacle(HSN).
with_poll_interval(Barnacle, Poll_interval) ->
erlang:setelement(4, Barnacle, Poll_interval).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 52).
-spec with_listener(
barnacle(HSQ),
gleam@erlang@process:subject(barnacle_response(HSQ))
) -> barnacle(HSQ).
with_listener(Barnacle, Listener) ->
erlang:setelement(5, Barnacle, {some, Listener}).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 98).
-spec with_connect_nodes_function(
strategy(HTC),
fun((list(gleam@erlang@atom:atom_())) -> {ok,
list(gleam@erlang@atom:atom_())} |
{error,
list({gleam@erlang@atom:atom_(), gleam@erlang@node:connect_error()})})
) -> strategy(HTC).
with_connect_nodes_function(Strategy, Connect_nodes) ->
erlang:setelement(3, Strategy, Connect_nodes).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 109).
-spec with_disconnect_nodes_function(
strategy(HTK),
fun((list(gleam@erlang@atom:atom_())) -> {ok,
list(gleam@erlang@atom:atom_())} |
{error, list({gleam@erlang@atom:atom_(), node_disconnect_error()})})
) -> strategy(HTK).
with_disconnect_nodes_function(Strategy, Disconnect_nodes) ->
erlang:setelement(4, Strategy, Disconnect_nodes).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 120).
-spec with_list_nodes_function(
strategy(HTS),
fun(() -> {ok, list(gleam@erlang@atom:atom_())} | {error, HTS})
) -> strategy(HTS).
with_list_nodes_function(Strategy, List_nodes) ->
erlang:setelement(5, Strategy, List_nodes).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 132).
-spec list_nodes() -> {ok, list(gleam@erlang@atom:atom_())} | {error, any()}.
list_nodes() ->
_pipe = [erlang:node() | erlang:nodes()],
_pipe@1 = gleam@list:map(_pipe, fun gleam_erlang_ffi:identity/1),
{ok, _pipe@1}.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 284).
-spec refresh(gleam@erlang@process:subject(message(HVC)), integer()) -> {ok,
list(gleam@erlang@atom:atom_())} |
{error, refresh_error(HVC)}.
refresh(Subject, Timeout) ->
gleam@otp@actor:call(
Subject,
fun(Subj) -> {refresh, {some, Subj}} end,
Timeout
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 289).
-spec pause(gleam@erlang@process:subject(message(any())), integer()) -> nil.
pause(Subject, Timeout) ->
gleam@otp@actor:call(
Subject,
fun(Subj) -> {pause, {some, Subj}} end,
Timeout
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 295).
-spec shutdown(gleam@erlang@process:subject(message(any())), integer()) -> nil.
shutdown(Subject, Timeout) ->
gleam@otp@actor:call(
Subject,
fun(Subj) -> {shutdown, {some, Subj}} end,
Timeout
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 357).
-spec send_response(gleam@option:option(gleam@erlang@process:subject(HVZ)), HVZ) -> nil.
send_response(Maybe_client, Response) ->
gleam@option:map(
Maybe_client,
fun(_capture) -> gleam@erlang@process:send(_capture, Response) end
),
nil.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 362).
-spec cancel_timer(gleam@option:option(gleam@erlang@process:timer())) -> nil.
cancel_timer(Timer) ->
gleam@option:map(Timer, fun gleam@erlang@process:cancel_timer/1),
nil.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 367).
-spec refresh_nodes(barnacle(HWD)) -> {ok, list(gleam@erlang@atom:atom_())} |
{error, refresh_error(HWD)}.
refresh_nodes(Barnacle) ->
gleam@result:'try'(
begin
_pipe = (erlang:element(2, erlang:element(3, Barnacle)))(),
gleam@result:map_error(
_pipe,
fun(Field@0) -> {strategy_error, Field@0} end
)
end,
fun(Available_nodes_list) ->
gleam@result:'try'(
begin
_pipe@1 = (erlang:element(5, erlang:element(3, Barnacle)))(),
gleam@result:map_error(
_pipe@1,
fun(Field@0) -> {strategy_error, Field@0} end
)
end,
fun(Current_nodes_list) ->
Self = begin
_pipe@2 = erlang:node(),
gleam_erlang_ffi:identity(_pipe@2)
end,
Available_nodes = begin
_pipe@3 = Available_nodes_list,
_pipe@4 = gleam@set:from_list(_pipe@3),
gleam@set:delete(_pipe@4, Self)
end,
Current_nodes = begin
_pipe@5 = Current_nodes_list,
_pipe@6 = gleam@set:from_list(_pipe@5),
gleam@set:delete(_pipe@6, Self)
end,
Nodes_to_add = gleam@set:difference(
Available_nodes,
Current_nodes
),
Nodes_to_remove = gleam@set:difference(
Current_nodes,
Available_nodes
),
Connect_results = (erlang:element(
3,
erlang:element(3, Barnacle)
))(
begin
_pipe@7 = Nodes_to_add,
gleam@set:to_list(_pipe@7)
end
),
gleam@result:'try'(
begin
_pipe@8 = Connect_results,
gleam@result:map_error(
_pipe@8,
fun(Field@0) -> {connect_error, Field@0} end
)
end,
fun(_) ->
Disconnect_results = (erlang:element(
4,
erlang:element(3, Barnacle)
))(
begin
_pipe@9 = Nodes_to_remove,
gleam@set:to_list(_pipe@9)
end
),
gleam@result:'try'(
begin
_pipe@10 = Disconnect_results,
gleam@result:map_error(
_pipe@10,
fun(Field@0) -> {disconnect_error, Field@0} end
)
end,
fun(_) ->
_pipe@11 = (erlang:element(
5,
erlang:element(3, Barnacle)
))(),
gleam@result:map_error(
_pipe@11,
fun(Field@0) -> {strategy_error, Field@0} end
)
end
)
end
)
end
)
end
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 275).
-spec run_once(barnacle(HUZ)) -> {ok, list(gleam@erlang@atom:atom_())} |
{error, refresh_error(HUZ)}.
run_once(Barnacle) ->
_pipe = Barnacle,
refresh_nodes(_pipe).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 306).
-spec handle_message(message(HVO), state(HVO)) -> gleam@otp@actor:next(any(), state(HVO)).
handle_message(Message, State) ->
{state, Self, Barnacle, Timer} = State,
case Message of
{refresh, Return} ->
Refresh_result = refresh_nodes(Barnacle),
cancel_timer(Timer),
Timer@1 = gleam@erlang@process:send_after(
Self,
erlang:element(4, Barnacle),
{refresh, none}
),
send_response(Return, Refresh_result),
send_response(
erlang:element(5, Barnacle),
{refresh_response, Refresh_result}
),
gleam@otp@actor:continue(
erlang:setelement(4, State, {some, Timer@1})
);
{pause, Return@1} ->
cancel_timer(Timer),
send_response(Return@1, nil),
send_response(erlang:element(5, Barnacle), {pause_response, nil}),
gleam@otp@actor:continue(erlang:setelement(4, State, none));
{shutdown, Return@2} ->
cancel_timer(Timer),
send_response(Return@2, nil),
send_response(erlang:element(5, Barnacle), {shutdown_response, nil}),
{stop, normal}
end.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 335).
-spec spec(
barnacle(HVS),
gleam@option:option(gleam@erlang@process:subject(gleam@erlang@process:subject(message(HVS))))
) -> gleam@otp@actor:spec(state(HVS), message(HVS)).
spec(Barnacle, Parent) ->
{spec,
fun() ->
gleam@option:map(
erlang:element(2, Barnacle),
fun(_capture) ->
gleam_erlang_ffi:register_process(erlang:self(), _capture)
end
),
Self = gleam@erlang@process:new_subject(),
Selector = begin
_pipe = gleam_erlang_ffi:new_selector(),
gleam@erlang@process:selecting(
_pipe,
Self,
fun gleam@function:identity/1
)
end,
gleam@option:map(
Parent,
fun(_capture@1) ->
gleam@erlang@process:send(_capture@1, Self)
end
),
Timer = gleam@erlang@process:send_after(
Self,
erlang:element(4, Barnacle),
{refresh, none}
),
{ready, {state, Self, Barnacle, {some, Timer}}, Selector}
end,
10000,
fun handle_message/2}.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 253).
-spec start(barnacle(HUQ)) -> {ok, gleam@erlang@process:subject(message(HUQ))} |
{error, gleam@otp@actor:start_error()}.
start(Barnacle) ->
_pipe = Barnacle,
_pipe@1 = spec(_pipe, none),
gleam@otp@actor:start_spec(_pipe@1).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 260).
-spec child_spec(
barnacle(HUT),
gleam@erlang@process:subject(gleam@erlang@process:subject(message(HUT)))
) -> gleam@otp@supervisor:child_spec(message(HUT), IHB, IHB).
child_spec(Barnacle, Parent) ->
gleam@otp@supervisor:worker(fun(_) -> _pipe = Barnacle,
_pipe@1 = spec(_pipe, {some, Parent}),
gleam@otp@actor:start_spec(_pipe@1) end).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 407).
-spec result_apply(list({ok, HWG} | {error, HWH})) -> {ok, list(HWG)} |
{error, list(HWH)}.
result_apply(Results) ->
case gleam@result:partition(Results) of
{Vals, []} ->
{ok, Vals};
{_, Errs} ->
{error, Errs}
end.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 138).
-spec connect_nodes(list(gleam@erlang@atom:atom_())) -> {ok,
list(gleam@erlang@atom:atom_())} |
{error,
list({gleam@erlang@atom:atom_(), gleam@erlang@node:connect_error()})}.
connect_nodes(Nodes) ->
_pipe = Nodes,
_pipe@1 = gleam@list:map(
_pipe,
fun(Node) -> case gleam_erlang_ffi:connect_node(Node) of
{ok, _} ->
{ok, Node};
{error, Err} ->
{error, {Node, Err}}
end end
),
result_apply(_pipe@1).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 149).
-spec disconnect_nodes(list(gleam@erlang@atom:atom_())) -> {ok,
list(gleam@erlang@atom:atom_())} |
{error, list({gleam@erlang@atom:atom_(), node_disconnect_error()})}.
disconnect_nodes(Nodes) ->
_pipe = Nodes,
_pipe@1 = gleam@list:map(
_pipe,
fun(Node) -> case barnacle_ffi:disconnect_from_node(Node) of
{ok, _} ->
{ok, Node};
{error, Err} ->
{error, {Node, Err}}
end end
),
result_apply(_pipe@1).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 79).
-spec default_strategy() -> strategy(any()).
default_strategy() ->
{strategy,
fun() -> {ok, []} end,
fun connect_nodes/1,
fun disconnect_nodes/1,
fun list_nodes/0}.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 28).
-spec default_barnacle() -> barnacle(any()).
default_barnacle() ->
{barnacle, none, default_strategy(), 5000, none}.
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 89).
-spec new_strategy(
fun(() -> {ok, list(gleam@erlang@atom:atom_())} | {error, HSY})
) -> strategy(HSY).
new_strategy(Discover_nodes) ->
erlang:setelement(2, default_strategy(), Discover_nodes).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 171).
-spec custom(strategy(HUI)) -> barnacle(HUI).
custom(Strategy) ->
erlang:setelement(3, default_barnacle(), Strategy).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 177).
-spec local_epmd() -> barnacle(nil).
local_epmd() ->
erlang:setelement(
3,
default_barnacle(),
erlang:setelement(
2,
default_strategy(),
fun barnacle@local_epmd:discover_nodes/0
)
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 189).
-spec epmd(list(gleam@erlang@atom:atom_())) -> barnacle(nil).
epmd(Nodes) ->
erlang:setelement(
3,
default_barnacle(),
erlang:setelement(2, default_strategy(), fun() -> {ok, Nodes} end)
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 203).
-spec dns(binary(), binary(), gleam@option:option(integer())) -> barnacle(barnacle@dns:lookup_error()).
dns(Basename, Hostname_query, Timeout) ->
erlang:setelement(
3,
default_barnacle(),
erlang:setelement(
2,
default_strategy(),
fun() ->
barnacle@dns:discover_nodes(
Basename,
Hostname_query,
gleam@option:unwrap(Timeout, 5000)
)
end
)
).
-file("/home/isaac/repos/pevensie/barnacle/src/barnacle.gleam", 428).
-spec get_node_basename(gleam@erlang@node:node_()) -> {ok, binary()} |
{error, nil}.
get_node_basename(Node) ->
_pipe = Node,
_pipe@1 = gleam_erlang_ffi:identity(_pipe),
_pipe@2 = erlang:atom_to_binary(_pipe@1),
_pipe@3 = gleam@string:split_once(_pipe@2, <<"@"/utf8>>),
gleam@result:map(_pipe@3, fun(Tuple) -> erlang:element(1, Tuple) end).