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