Method: BinaryFinery#method_missing

Defined in:
lib/binary_finery.rb

#method_missing(method_name, *args, &block) ⇒ Object



293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
# File 'lib/binary_finery.rb', line 293

def method_missing(method_name, *args, &block)
  if method_name.to_s =~ OP_INT_RE
    op, type, bits, byte_order = Regexp.last_match[1..4]
    # string → sym
    op, type, byte_order = [op, type].map!(&:to_sym)
    # adjust bits to bytes
    byte_size = (bits.to_i / 8)
    # normalize endianness
    byte_order = byte_order.to_sym unless byte_order.nil?
    byte_order = :big if byte_order == 'network'

    fmt = format(byte_size,type,byte_order)

    case op
    when :read
      self.class.send :define_method, method_name do
        readn_unpack(byte_size, fmt, byte_order)
      end
      self.send method_name
    when :write
      if (args.first.kind_of? Integer) && (args.size == 1)
        self.class.send :define_method, method_name do |value|
          write_pack(value, fmt, byte_order)
        end
        self.send method_name, args.first
      end
    end
  elsif method_name.to_s =~ OP_STR_RE
    op, string_flavor = Regexp.last_match[1..2]
    case op
    when :read
      options = args.first.indexes(:size, :padding)
      self.send :read_string, options
    when :write
      str, options = args.shift, args
      self.send :write_string, str, options
    end
  else
    super
  end
end