class Depix::Binary::Fields::ArrayField

Wrapper for an array structure

Attributes

members[RW]

Public Instance Methods

consume!(stack) click to toggle source
# File lib/depix/binary/fields.rb, line 277
def consume!(stack)
  members.map{|m| m.consume!(stack)}
end
explain() click to toggle source
# File lib/depix/binary/fields.rb, line 285
def explain
  return 'Empty array' if (!members || members.empty?)
  tpl = "(Array of %d %s fields)" % [ members.length, members[0].rtype]
  r = (req? ? "- required" : nil)
  [tpl, desc, r].compact.join(' ')
end
length() click to toggle source
# File lib/depix/binary/fields.rb, line 269
def length
  members.inject(0){|_, s| _ + s.length }
end
pack(values) click to toggle source
# File lib/depix/binary/fields.rb, line 300
def pack(values)
  # For members that are present, get values. For members that are missing, fill with null bytes upto length.
  # For values that are nil, skip packing
  members.zip(values).map do |m, v| 
    if !m.req? && v.nil?
      raise "#{m} needs to provide length" unless m.length
      "\377" * m.length
    else
      v.respond_to?(:pack) ? v.pack : m.pack(v)
    end
  end.join
end
pattern() click to toggle source
# File lib/depix/binary/fields.rb, line 273
def pattern
  members.inject(''){|_, s| _ + s.pattern }
end
rtype() click to toggle source
# File lib/depix/binary/fields.rb, line 281
def rtype
  Array
end
validate!(array) click to toggle source
# File lib/depix/binary/fields.rb, line 292
def validate!(array)
  raise "This value would overflow, #{array.length} elements passed but only #{members.length} fit" unless array.length <= members.length
  raise "This value is required, but the array is empty" if req? && array.empty?
  array.zip(members).map do | v, m | 
    m.validate!(v) unless (v.nil? && !m.req?)
  end
end