Class: MODL::Parser::KeylistExtractor

Inherits:
Object
  • Object
show all
Defined in:
lib/modl/parser/modl_keylist.rb

Overview

Extracts an index definition from a ParsedPair

Class Method Summary collapse

Class Method Details

.extract(pair, item) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/modl/parser/modl_keylist.rb', line 29

def self.extract(pair, item)
  # the item must be an array of arrays
  pair.key_lists = []
  last_keylist_len = 0
  if item.is_a?(Parsed::ParsedValueItem) && item.value.is_a?(Parsed::ParsedValue) && item.value.array
    item.value.array.abstractArrayItems.each do |avi|
      key_list = []
      avi.arrayValueItem.array.abstractArrayItems.each do |key|
        key_list << key.arrayValueItem.primitive.string.string if key.arrayValueItem.primitive.string
        key_list << key.arrayValueItem.primitive.number.num if key.arrayValueItem.primitive.number
      end
      if key_list.length > last_keylist_len
        last_keylist_len = key_list.length
      else
        raise InterpreterError, 'Error: Key lists in *assign are not in ascending order of list length: ' + key_list.to_s
      end
      pair.key_lists << key_list
    end
  elsif item.is_a?(Parsed::ParsedArray)
    item.abstractArrayItems.each do |avi|
      key_list = []
      avi.arrayValueItem.array.abstractArrayItems.each do |key|
        key_list << key.arrayValueItem.primitive.string.string if key.arrayValueItem.primitive.string
        key_list << key.arrayValueItem.primitive.number.num if key.arrayValueItem.primitive.number
      end
      if key_list.length > last_keylist_len
        last_keylist_len = key_list.length
      else
        raise InterpreterError, 'Error: Key lists in *assign are not in ascending order of list length.'
      end
      pair.key_lists << key_list
    end
  else
    raise InterpreterError, 'Array of arrays expected for: ' + pair.key
  end
end