%%%----------------------------------------------------------------------------- %% @doc elector application module that bootstraps the elector. %% @private %% @end %%%----------------------------------------------------------------------------- -module(elector_app). %%------------------------------------------------------------------------------ %% Behaviours %%------------------------------------------------------------------------------ -behaviour(application). %%------------------------------------------------------------------------------ %% Exported API %%------------------------------------------------------------------------------ -export([start/2, stop/1]). %%------------------------------------------------------------------------------ %% Exported functions %%------------------------------------------------------------------------------ %% @doc Starts the elector application. -spec start(_StartType :: term(), _StartArgs :: term()) -> ok. start(_StartType, _StartArgs) -> validate(), elector_sup:start_link(). -spec stop(_State :: term()) -> ok. stop(_State) -> ok. %%------------------------------------------------------------------------------ %% internal functions %%------------------------------------------------------------------------------ %% @doc Validates the strategy module. validate() -> Strategy_module = elector_config_handler:strategy_module(), Attributes = erlang:apply(Strategy_module, module_info, [attributes]), Behaviours = proplists:get_value(behaviour, Attributes), Is_strategy = lists:member(elector_strategy_behaviour, Behaviours), if Is_strategy /= true -> throw({strategy_implementation_error, "Strategy module must implement the base strategy behaviour"}); true -> nil end, ok.