lib/exvcr/actor.ex

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