lib/rule_engine/state/inline_state_manager.ex

#-------------------------------------------------------------------------------
# Author: Keith Brings
# Copyright (C) 2018 Noizu Labs, Inc. All rights reserved.
#-------------------------------------------------------------------------------

defmodule Noizu.RuleEngine.State.InlineStateManager do

  @type t :: %__MODULE__{
               settings: Noizu.RuleEngine.ScriptSettings.t,
               global_state: %{},
               entity_state: %{any => %{}}
             }

  @default_settings %Noizu.RuleEngine.StateSettings{
    supports_async?: false,
    supports_transactions?: true,
    user_settings: %{}
  }

  defstruct [
    settings: @default_settings,
    entity_state: %{},
    global_state: %{}
  ]
end

defimpl Noizu.RuleEngine.StateProtocol, for: Noizu.RuleEngine.State.InlineStateManager do
  #-------------------------
  #
  #-------------------------
  def settings(entry, _context) do
    entry.settings
  end

  #-------------------------
  #
  #-------------------------
  def setting(entry, setting, _context) do
    cond do
      Map.has_key?(entry.settings, setting) -> Map.get(entry.settings, setting)
      true -> entry.settings.user_settings[setting]
    end
  end

  #-------------------------
  #
  #-------------------------
  def put!(entry, field, value, _context) do
    put_in(entry, [Access.key(:global_state), field], value)
  end

  #-------------------------
  #
  #-------------------------
  def put!(entry, entity, field, value, _context) do
    cond do
      entry.entity_state[entity] -> put_in(entry, [Access.key(:entity_state), entity, field], value)
      true -> put_in(entry, [Access.key(:entity_state), entity], %{field => value})
    end
  end

  #-------------------------
  #
  #-------------------------
  def get!(entry, field, _context) do
    {entry.global_state[field], entry}
  end

  #-------------------------
  #
  #-------------------------
  def get!(entry, entity, field, _context) do
    {entry.entity_state[entity][field], entry}
  end
end