Current section
Files
Jump to
Current section
Files
lib/liason.ex
defmodule Liaison do
@doc """
Get all current strategies defined in configuration
"""
@spec get_strategies() :: list(list())
def get_strategies() do
Application.get_env(:liaison, :strategies)
end
@doc """
Change the strategies employed and persist them to the environment
"""
@spec set_strategies(any) :: :ok
def set_strategies(strategies) do
# set the new application settings
Application.put_env(:liaison, :strategies, strategies)
# create a map by Module (these are the new settings)
strategies = strategy_by_module(strategies)
Enum.each(strategies, &apply_strategy/1)
end
# def set_strategy(strat_config) do
# end
# def set_strategy(module, strat_config) do
# end
@doc """
Returns info about the monitors currently running
"""
@spec get_monitors() :: list(tuple)
def get_monitors() do
Supervisor.which_children(Liaison.Supervisor)
|> Enum.reject(&(elem(&1, 1) == :undefined))
end
defp get_monitored_modules() do
Enum.map(get_monitors(), &elem(&1, 0))
end
# --------------------- helpers ---------------------
defp strategy_by_module(strategies) do
Enum.reduce(strategies, [], fn config, acc ->
[{config[:strategy], config} | acc]
end)
end
defp apply_strategy({module, strat_config}) do
started_monitors = get_monitored_modules()
case Enum.member?(started_monitors, module) do
true ->
apply(module, :update_strategy, strat_config)
false ->
Liaison.Application.add_child(strat_config)
end
end
end