1defmodule Drinkup do
2 use Supervisor
3 alias Drinkup.Options
4
5 @dialyzer nowarn_function: {:init, 1}
6 @impl true
7 def init({%Options{name: name} = drinkup_options, supervisor_options}) do
8 children = [
9 {Task.Supervisor, name: {:via, Registry, {Drinkup.Registry, {name, Tasks}}}},
10 {Drinkup.Socket, drinkup_options}
11 ]
12
13 Supervisor.start_link(
14 children,
15 supervisor_options ++ [name: {:via, Registry, {Drinkup.Registry, {name, Supervisor}}}]
16 )
17 end
18
19 @spec child_spec(Options.options()) :: Supervisor.child_spec()
20 def child_spec(%{} = options), do: child_spec({options, [strategy: :one_for_one]})
21
22 @spec child_spec({Options.options(), Keyword.t()}) :: Supervisor.child_spec()
23 def child_spec({drinkup_options, supervisor_options}) do
24 %{
25 id: Map.get(drinkup_options, :name, __MODULE__),
26 start: {__MODULE__, :init, [{Options.from(drinkup_options), supervisor_options}]},
27 type: :supervisor,
28 restart: :permanent,
29 shutdown: 500
30 }
31 end
32end