diff --git a/lib/aife/drone.ex b/lib/aife/drone.ex index 74b3621..920de50 100644 --- a/lib/aife/drone.ex +++ b/lib/aife/drone.ex @@ -16,6 +16,12 @@ defmodule Aife.Drone do """ @moduledoc since: "0.1.0" + alias Aife.Drone + + use GenServer + + defstruct enabled?: false, human: %{traits: %{}}, drone: %{traits: %{}}, values: %{} + @doc """ Sends a command to a drone. @@ -23,6 +29,7 @@ defmodule Aife.Drone do """ @doc since: "0.1.0" def command(drone, cmd) do + GenServer.cast(drone, {:command, cmd}) end @doc """ @@ -34,6 +41,7 @@ defmodule Aife.Drone do """ @doc since: "0.1.0" def enable(drone) do + GenServer.cast(drone, :enable) end @doc """ @@ -43,6 +51,7 @@ defmodule Aife.Drone do """ @doc since: "0.1.0" def disable(drone) do + GenServer.cast(drone, :disable) end @doc """ @@ -50,6 +59,7 @@ defmodule Aife.Drone do """ @doc since: "0.1.0" def traits(drone) do + GenServer.call(drone, :traits) end @doc """ @@ -69,6 +79,7 @@ defmodule Aife.Drone do """ @doc since: "0.1.0" def alter_traits(drone, form \\ :current, values \\ []) do + GenServer.cast(drone, {:alter, form, values}) end @doc """ @@ -82,10 +93,11 @@ defmodule Aife.Drone do Aife.Drone.get_values(drone, :fetishes) #=> [fetishes: [:maid, :latex, :hypnosis]] Aife.Drone.insert_value(drone, :fetishes, :haigure) - #=> {:ok, [fetishes: [:maid, :latex, :haigure, :hypnosis]]} + #=> [fetishes: [:maid, :latex, :haigure, :hypnosis]] """ @doc since: "0.1.0" def insert_value(drone, key, value) do + GenServer.call(drone, {:insert_value, key, value}) end @doc """ @@ -101,12 +113,13 @@ defmodule Aife.Drone do Aife.Drone.get_values(drone, :fetishes) #=> [fetishes: [:maid, :latex, :haigure, :hypnosis]] Aife.Drone.remove_value(drone, :fetishes, :haigure) - #=> {:ok, [fetishes: [:maid, :latex, :hypnosis]]} + #=> [fetishes: [:maid, :latex, :hypnosis]] Aife.Drone.remove_value(drone, :fetishes, :haigure) - #=> {:ok, [fetishes: [:maid, :latex, :hypnosis]]} + #=> [fetishes: [:maid, :latex, :hypnosis]] """ @doc since: "0.1.0" def remove_value(drone, key, value) do + GenServer.call(drone, {:remove_value, key, value}) end @doc """ @@ -116,6 +129,7 @@ defmodule Aife.Drone do """ @doc since: "0.1.0" def say(drone, text) do + GenServer.cast(drone, {:say, text}) end @doc """ @@ -132,5 +146,45 @@ defmodule Aife.Drone do """ @doc since: "0.1.0" def think(drone, thought) do + GenServer.cast(drone, {:think, thought}) end + + ## GenServer calls. + + def start_link() do + GenServer.start_link(__MODULE__, []) + end + + @impl GenServer + def init(_) do + {:ok, %Drone{}} + end + + @impl GenServer + def handle_call(:traits, _from, state) do + form = + case state.enabled? do + true -> :drone + false -> :human + end + + {:reply, state[form].traits, state} + end + + def handle_call({:insert_value, key, value}, _from, state) do + # TODO + {:reply, state, state} + end + + def handle_call({:remove_value, key, value}, _from, state) do + # TODO + {:reply, state, state} + end + + @impl GenServer + def handle_cast({:command, _cmd}, state), do: {:noreply, state} + def handle_cast(:disable, state), do: {:noreply, %{state | enabled?: false}} + def handle_cast(:enable, state), do: {:noreply, %{state | enabled?: true}} + def handle_cast({:say, _text}, state), do: {:noreply, state} + def handle_cast({:think, _thought}, state), do: {:noreply, state} end diff --git a/lib/aife/drone/dynamic_supervisor.ex b/lib/aife/drone/dynamic_supervisor.ex new file mode 100644 index 0000000..dc50251 --- /dev/null +++ b/lib/aife/drone/dynamic_supervisor.ex @@ -0,0 +1,12 @@ +defmodule Aife.Drone.DynamicSupervisor do + use DynamicSupervisor + + def start_link(_) do + DynamicSupervisor.start_link(__MODULE__, nil, name: __MODULE__) + end + + @impl DynamicSupervisor + def init(_init_arg) do + DynamicSupervisor.init(strategy: :one_for_one) + end +end diff --git a/lib/aife/drone/supervisor.ex b/lib/aife/drone/supervisor.ex new file mode 100644 index 0000000..d1bd419 --- /dev/null +++ b/lib/aife/drone/supervisor.ex @@ -0,0 +1,16 @@ +defmodule Aife.Drone.Supervisor do + use Supervisor + + def start_link(_) do + Supervisor.start_link(__MODULE__, []) + end + + def init(_) do + children = [ + {Registry, name: Aife.Drone.Registry, keys: :unique}, + {DynamicSupervisor, name: Aife.Drone.DynamicSupervisor, strategy: :one_for_one} + ] + + Supervisor.init(children, strategy: :one_for_one) + end +end diff --git a/test/aife/drone_test.exs b/test/aife/drone_test.exs new file mode 100644 index 0000000..5727b6a --- /dev/null +++ b/test/aife/drone_test.exs @@ -0,0 +1,4 @@ +defmodule Aife.DroneTest do + use ExUnit.Case + doctest Aife.Drone +end