defmodule Kanta do
@moduledoc """
Main Kanta supervisor
"""
use Supervisor
alias Kanta.{Config, Registry}
alias Kanta.POFiles.MessagesExtractorAgent
def start_link(opts) when is_list(opts) do
conf = Config.new(opts)
Supervisor.start_link(__MODULE__, conf, name: Registry.via(conf.name, nil, conf))
end
def child_spec(opts) do
opts
|> super()
|> Supervisor.child_spec(id: Keyword.get(opts, :name, __MODULE__))
end
@impl Supervisor
def init(%Config{plugins: plugins} = conf) do
children = [
{MessagesExtractorAgent, conf: conf, name: Registry.via(conf.name, MessagesExtractorAgent)}
]
children = children ++ Enum.map(plugins, &plugin_child_spec(&1, conf))
Supervisor.init(children, strategy: :one_for_one)
end
def config(name \\ __MODULE__), do: Registry.config(name)
def plugin_enabled?(plugin_name) do
case Enum.find(config().plugins, &(elem(&1, 0) == plugin_name)) do
nil -> false
_ -> true
end
end
defp plugin_child_spec({module, opts}, conf) do
name = Registry.via(conf.name, {:plugin, module})
opts = Keyword.merge(opts, conf: conf, name: name)
Supervisor.child_spec({module, opts}, id: {:plugin, module})
end
end