#------------------------------------------------------------------------------- # 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