defmodule X3m.System.Facade.Supervisor do use Supervisor import Cachex.Spec def start_link(facade_module, facade_name, opts \\ []) do Supervisor.start_link(__MODULE__, {facade_module, facade_name, opts}, name: _name(facade_name)) end def init({facade_module, facade_name, opts}) do children = [ worker(Cachex, [_cache_name(facade_name), [expiration: expiration(interval: 10_000)]]), supervisor(Task.Supervisor, [[name: _request_sup_name(facade_name)]]), worker(facade_module, [ _request_sup_name(facade_name), _cache_name(facade_name), Keyword.put(opts, :name, facade_name) ]) ] supervise(children, strategy: :one_for_one) end defp _name({:global, facade_name}), do: _name(facade_name) defp _name(facade_name), do: Module.concat(facade_name, Supervisor) defp _request_sup_name({:global, facade_name}), do: _request_sup_name(facade_name) defp _request_sup_name(facade_name), do: Module.concat(facade_name, RequestHandler) defp _cache_name({:global, facade_name}), do: _cache_name(facade_name) defp _cache_name(facade_name), do: Module.concat(facade_name, RequestCache) end