farmbot_os/lib/farmbot/transport/supervisor.ex

55 lines
1.6 KiB
Elixir

defmodule Farmbot.Transport.Supervisor do
@moduledoc """
Supervises services that communicate with the outside world.
"""
use Supervisor
alias Farmbot.Context
use Farmbot.DebugLog
case Mix.env do
:test ->
defp setup_env do
Mix.shell.info [:green, "Deleting environment!!!!!!"]
Application.delete_env(:farmbot, :transports)
Application.put_env(:farmbot, :transports, [])
:ok
end
_ ->
defp setup_env do
:ok
end
end
def init(context) do
:ok = setup_env()
transports = Application.get_env(:farmbot, :transports)
children = [ default_transport(context) | build_children(transports, context)]
opts = [strategy: :one_for_one]
supervise(children, opts)
end
defp default_transport(%Context{} = ctx) do
worker(Farmbot.Transport, [ctx, [name: Farmbot.Transport]], restart: :permanent)
end
@doc """
Starts all the transports.
"""
def start_link(%Context{} = ctx, opts),
do: Supervisor.start_link(__MODULE__, ctx, opts)
@spec build_children([atom], Context.t) :: [Supervisor.child]
defp build_children(transports, %Context{} = context) do
Enum.map(transports, fn(t) ->
case t do
module when is_atom(module) ->
debug_log "starting tansport: #{module}"
worker(module, [context, []], restart: :permanent)
{module, opts} when is_atom(module) ->
debug_log "starting transport: #{module} with opts: #{inspect opts}"
worker(module, [context, opts], restart: :permanent)
end
end)
end
end