Current section

Files

Jump to
nuamnesia lib amnesia emulator emulator.ex
Raw

lib/amnesia/emulator/emulator.ex

# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
# Version 2, December 2004
#
# DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
#
# 0. You just DO WHAT THE FUCK YOU WANT TO.
defmodule Amnesia.Emulator do
defstruct [
tables: %{},
event: 0,
history: []
]
defmacro __using__(_options \\ []) do
quote location: :keep do
require Amnesia.Emulator
import Amnesia.Emulator
require Amnesia.Emulator.Database
import Amnesia.Emulator.Database
use Agent
require Amnesia.Emulator.Records
import Amnesia.Emulator.Records
def start(scenario \\ :default, settings \\ []) do
session = init_session(scenario, settings)
handle = emulator_handle(session)
Process.put({__MODULE__, :scenario}, scenario)
Agent.start_link(fn() -> %Amnesia.Emulator{} end, name: handle)
end
defp init_session(scenario, settings) do
slice = {self(), :os.system_time(:millisecond)}
session = emulator_session(emulator: __MODULE__, scenario: scenario, slice: slice, settings: settings)
Process.put({__MODULE__, scenario}, session)
session
end
def scenario() do
Process.get({__MODULE__, :scenario})
end
def session(scenario) do
Process.get({__MODULE__, scenario})
end
def emulator_handle() do
emulator_handle(session(scenario()))
end
def emulator_handle(emulator_session(scenario: scenario, slice: slice)) do
{:global, {__MODULE__, scenario, slice}}
end
#-----------------------------
# Internal State Manipulation
#-----------------------------
@doc """
Get Emulated Table State
"""
def __table__(table), do: Agent.get(emulator_handle(), &(&1.tables[table] || %{records: %{}, state: :false, history: []}))
def __init_table__(config = emulator_session(table: table), data) do
Agent.update(emulator_handle(config), &(put_in(&1, [Access.key(:tables), table], data)))
end
def __set_table_state__(config = emulator_session(table: table), status) do
Amnesia.Emulator.Table.Mock.__set_state__(config, status)
end
@doc """
Get Emulator State
"""
def __emulator__(), do: Agent.get(emulator_handle(), &(&1))
@doc """
Get Emulated Table Record State
"""
def __record__(table, key) do
Agent.get(
emulator_handle(),
&(get_in(&1, [Access.key(:tables, %{}), Access.key(table, %{}), Access.key(:records, %{}), key]) || %Amnesia.Emulator.Table.Record{exists?: false})
)
end
@doc """
Get Call History
"""
def __history__() do
Agent.get(
emulator_handle(),
&(get_in(&1, [Access.key(:history, [])]))
)
end
@doc """
Get Table Call History
"""
def __table_history__(table) do
Agent.get(
emulator_handle(),
&((get_in(&1, [Access.key(:tables, %{}), Access.key(table)]) || %Amnesia.Emulator.Table{}).history)
)
end
@doc """
Get Record Call History
"""
def __record_history__(table, key) do
Agent.get(
emulator_handle(),
&((get_in(&1, [Access.key(:tables, %{}), Access.key(table, %{}), Access.key(:records, %{}), key]) || %Amnesia.Emulator.Table.Record{exists?: false}).history)
)
end
end
end
end