#-------------------------------------------------------------------------------
# Author: Keith Brings
# Copyright (C) 2018 Noizu Labs, Inc. All rights reserved.
#-------------------------------------------------------------------------------
defmodule Noizu.RuleEngine.Op.GetOp do
@type t :: %__MODULE__{
name: String.t | nil,
description: String.t | nil,
identifier: String.t | list | tuple, # Materialized Path.
entity: any,
field: any,
}
defstruct [
name: nil,
description: nil,
identifier: nil,
entity: :global,
field: nil,
]
end
defimpl Noizu.RuleEngine.ScriptProtocol, for: Noizu.RuleEngine.Op.GetOp do
alias Noizu.RuleEngine.Helper
#-----------------
# execute!/3
#-----------------
def execute!(this, state, context), do: execute!(this, state, context, %{})
#-----------------
# execute!/4
#-----------------
def execute!(this, state, context, _options) do
#@TODO support for deep lookup entity[p][a][t][h]
cond do
this.entity == :global -> Noizu.RuleEngine.StateProtocol.get!(state, this.field, context)
true -> Noizu.RuleEngine.StateProtocol.get!(state, this.entity, this.field, context)
end
end
#---------------------
# identifier/3
#---------------------
def identifier(this, _state, _context), do: Helper.identifier(this)
#---------------------
# identifier/4
#---------------------
def identifier(this, _state, _context, _options), do: Helper.identifier(this)
#---------------------
# render/3
#---------------------
def render(this, state, context), do: render(this, state, context, %{})
#---------------------
# render/4
#---------------------
def render(this, state, context, options) do
depth = options[:depth] || 0
prefix = (depth == 0) && (">> ") || (String.duplicate(" ", ((depth - 1) * 4) + 3) <> "|-- ")
id = identifier(this, state, context, options)
"#{prefix}#{id} [GET #{inspect this.entity}.#{this.field}]\n"
end
end