Current section

Files

Jump to
vent src vent_subscriber_sup.erl
Raw

src/vent_subscriber_sup.erl

%%%-------------------------------------------------------------------
%% @doc vent subsciber supervisor.
%% @end
%%%-------------------------------------------------------------------
-module(vent_subscriber_sup).
-behaviour(supervisor).
-include("vent_internal.hrl").
%% API
-export([start_link/4]).
%% Supervisor callbacks
-export([init/1]).
-define(SERVER, ?MODULE).
%%====================================================================
%% API functions
%%====================================================================
-spec start_link(SupName :: atom(),
PoolName :: atom(),
host_opts(),
vent_subscriber:opts()) -> {ok, pid()}.
start_link(SupName, PoolName, HostOpts, Opts) ->
supervisor:start_link({local, SupName}, ?MODULE,
{PoolName, HostOpts, Opts}).
%%====================================================================
%% Supervisor callbacks
%%====================================================================
%% Child :: {Id,StartFunc,Restart,Shutdown,Type,Modules}
-spec init({PoolName :: atom(), host_opts(), vent_subscriber:opts()}) ->
{ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}.
init({PoolName, HostOpts, Opts}) ->
Specs = subscriber_specs(PoolName, HostOpts, Opts),
{ok, {sup_flags(), Specs}}.
%%====================================================================
%% Internal functions
%%====================================================================
-spec sup_flags() -> supervisor:sup_flags().
sup_flags() ->
#{strategy => one_for_one}.
-spec subscriber_specs(PoolName :: atom(),
host_opts(),
vent_subscriber:opts()) -> [supervisor:child_spec()].
subscriber_specs(PoolName, HostOpts, Opts = #{name := Name,
n_workers := NWorkers}) ->
[begin
ID = {Name, SeqId},
Opts1 = Opts#{id => ID, pool => PoolName},
#{id => ID,
start => {vent_subscriber, start_link, [HostOpts, Opts1]}}
end || SeqId <- lists:seq(1, NWorkers)].