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