-module(treewalker_crawler_sup).
-behaviour(supervisor).
%% API
-export([start_link/3,
start_crawler/1,
stop_crawler/1]).
%% Supervisor callbacks
-export([init/1]).
-define(VIA_GPROC(Id), {via, gproc, {n, l, Id}}).
-define(DISPATCHER_ID(Id), {dispatcher, Id}).
-define(CRAWLER_ID(Id), {crawler, Id}).
-opaque dispatcher_id() :: {dispatcher, term()}.
-opaque crawler_id() :: {crawler, term()}.
-export_type([dispatcher_id/0,
crawler_id/0]).
%%====================================================================
%% API functions
%%====================================================================
-spec start_link(term(), term(), map()) -> {ok, pid()} | ignore | {error, term()}.
start_link(Name, Id, Options) ->
supervisor:start_link(?VIA_GPROC(Name), ?MODULE, [Id, Options]).
-spec start_crawler(term()) -> ok.
start_crawler(Name) ->
Id = ?CRAWLER_ID(Name),
treewalker_crawler:start_crawler(Id).
-spec stop_crawler(term()) -> ok.
stop_crawler(Name) ->
Id = ?CRAWLER_ID(Name),
treewalker_crawler:stop_crawler(Id).
%%====================================================================
%% Supervisor callbacks
%%====================================================================
init([Id, Options]) ->
DispatcherId = ?DISPATCHER_ID(Id),
CrawlerId = ?CRAWLER_ID(Id),
{ok, {#{strategy => one_for_all,
intensity => 5,
period => 10},
[
#{id => treewalker_dispatcher,
start => {treewalker_dispatcher, start_link, [DispatcherId, Options]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => []},
#{id => treewalker_crawler,
start => {treewalker_crawler, start_link, [CrawlerId, DispatcherId, Options]},
restart => permanent,
shutdown => 5000,
type => worker,
modules => []}
]}}.