Class: Depix::ArrayField

Inherits:
Field
  • Object
show all
Defined in:
lib/depix/dict.rb

Overview

Wrapper for an array structure

Instance Attribute Summary collapse

Attributes inherited from Field

#desc, #name, #req

Instance Method Summary collapse

Methods inherited from Field

#clean, emit_char, emit_r32, emit_u16, emit_u32, emit_u8, #initialize

Constructor Details

This class inherits a constructor from Depix::Field

Instance Attribute Details

#membersObject

Returns the value of attribute members.



257
258
259
# File 'lib/depix/dict.rb', line 257

def members
  @members
end

Instance Method Details

#consume!(stack) ⇒ Object



268
269
270
# File 'lib/depix/dict.rb', line 268

def consume!(stack)
  members.map{|m| m.consume!(stack)}
end

#explainObject



276
277
278
279
280
281
# File 'lib/depix/dict.rb', line 276

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

#lengthObject



260
261
262
# File 'lib/depix/dict.rb', line 260

def length
  members.inject(0){|_, s| _ + s.length }
end

#pack(values) ⇒ Object



291
292
293
294
295
296
297
298
299
300
301
302
# File 'lib/depix/dict.rb', line 291

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

#patternObject



264
265
266
# File 'lib/depix/dict.rb', line 264

def pattern
  members.inject(''){|_, s| _ + s.pattern }
end

#rtypeObject



272
273
274
# File 'lib/depix/dict.rb', line 272

def rtype
  Array
end

#validate!(array) ⇒ Object



283
284
285
286
287
288
289
# File 'lib/depix/dict.rb', line 283

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