defmodule ExVCR.Actor do @moduledoc """ Provides data store for values used by ExVCR.Recorder. """ defmodule Responses do @moduledoc """ Stores request/response for the recorder. """ use ExActor.GenServer defstart start(arg), do: initial_state(arg) defcast append(x), state: state, do: new_state([x|state]) defcast set(x), do: new_state(x) defcall get, state: state, do: reply(state) defcall update(finder, updater), state: state do state = Enum.map(state, fn(record) -> if finder.(record) do updater.(record) else record end end) set_and_reply(state, state) end defcall pop(), state: state do case state do [] -> reply(state) [head | tail] -> set_and_reply(tail, head) end end end defmodule Options do @moduledoc """ Stores option parameters for the recorder. """ use ExActor.GenServer defstart start(arg), do: initial_state(arg) defcast set(x), do: new_state(x) defcall get, state: state, do: reply(state) end defmodule CurrentRecorder do @moduledoc """ Stores current recorder to be able to fetch it inside of the mocked version of the adapter. """ use ExActor.GenServer, export: __MODULE__ defstart(start_link(_), do: default_state() |> initial_state()) defcast(set(x), do: new_state(x)) defcall(get, state: state, do: reply(state)) def default_state(), do: nil end end