Class: DecisionAgent::Dmn::Feel::Transformer

Inherits:
Parslet::Transform
  • Object
show all
Defined in:
lib/decision_agent/dmn/feel/transformer.rb

Overview

Transforms Parslet parse tree into AST

Class Method Summary collapse

Class Method Details

.apply_postfix_op(current, op) ⇒ Object

Apply a single postfix operation to the current AST node



34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/decision_agent/dmn/feel/transformer.rb', line 34

def self.apply_postfix_op(current, op)
  return current unless op.is_a?(Hash)

  if op[:property_access]
    { type: :property_access, object: current, property: op[:property_access][:property][:identifier].to_s }
  elsif op[:function_call]
    { type: :function_call, name: current, arguments: op[:function_call][:arguments] || [] }
  elsif op[:filter]
    { type: :filter, list: current, condition: op[:filter][:filter] }
  else
    current
  end
end

.extract_entry_key(key_node) ⇒ Object

Extract a context entry key from various node representations



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/decision_agent/dmn/feel/transformer.rb', line 12

def self.extract_entry_key(key_node)
  return key_node.to_s if key_node.is_a?(Parslet::Slice)
  return key_node.to_s unless key_node.is_a?(Hash)

  case key_node[:type]
  when :field      then key_node[:name].to_s
  when :string     then key_node[:value].to_s
  when :identifier then key_node[:name].to_s
  else
    key_node[:identifier]&.to_s || key_node[:string]&.to_s || key_node.to_s
  end
end

.extract_name(name_node) ⇒ Object

Extract a name string from a node that may be a Hash or raw value



26
27
28
29
30
31
# File 'lib/decision_agent/dmn/feel/transformer.rb', line 26

def self.extract_name(name_node)
  return name_node.to_s.strip unless name_node.is_a?(Hash)
  return name_node[:name].to_s.strip if name_node[:type] == :field

  name_node[:identifier]&.to_s&.strip || name_node.to_s
end

.extract_variable_name(var_node) ⇒ Object

Extract variable name from a potentially transformed node



49
50
51
52
53
54
55
56
57
# File 'lib/decision_agent/dmn/feel/transformer.rb', line 49

def self.extract_variable_name(var_node)
  if var_node.is_a?(Hash) && var_node[:type] == :field
    var_node[:name]
  elsif var_node.is_a?(Hash) && var_node[:identifier]
    var_node[:identifier].to_s
  else
    var_node.to_s
  end
end