defmodule Drone.Supervisor do @moduledoc """ Dynamic supervisor for drone vehicle processes. Each drone is started as a child `Drone.Vehicle` process under this supervisor. Processes are looked up by name via the `Drone.Vehicle.Registry`. """ use DynamicSupervisor @spec start_link(keyword()) :: GenServer.on_start() def start_link(opts \\ []) do DynamicSupervisor.start_link(__MODULE__, opts, name: __MODULE__) end @impl true def init(_opts) do DynamicSupervisor.init(strategy: :one_for_one) end @spec start_vehicle(keyword()) :: Supervisor.on_start_child() def start_vehicle(opts) do spec = {Drone.Vehicle, opts} DynamicSupervisor.start_child(__MODULE__, spec) end @spec stop_vehicle(atom()) :: :ok | {:error, :not_found} def stop_vehicle(name) do case Drone.Vehicle.whereis(name) do nil -> {:error, :not_found} pid -> DynamicSupervisor.terminate_child(__MODULE__, pid) end end end