Class: BinData::DSLMixin::DSLFieldParser

Inherits:
Object
  • Object
show all
Defined in:
lib/bindata/dsl.rb

Overview

Extracts the details from a field declaration.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hints, symbol, *args, &block) ⇒ DSLFieldParser

Returns a new instance of DSLFieldParser.



350
351
352
353
354
355
# File 'lib/bindata/dsl.rb', line 350

def initialize(hints, symbol, *args, &block)
  @hints  = hints
  @type   = symbol
  @name   = name_from_field_declaration(args)
  @params = params_from_field_declaration(args, &block)
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



357
358
359
# File 'lib/bindata/dsl.rb', line 357

def name
  @name
end

#paramsObject (readonly)

Returns the value of attribute params.



357
358
359
# File 'lib/bindata/dsl.rb', line 357

def params
  @params
end

#typeObject (readonly)

Returns the value of attribute type.



357
358
359
# File 'lib/bindata/dsl.rb', line 357

def type
  @type
end

Instance Method Details

#name_from_field_declaration(args) ⇒ Object



359
360
361
362
363
364
365
366
# File 'lib/bindata/dsl.rb', line 359

def name_from_field_declaration(args)
  name, _ = args
  if name == "" or name.is_a?(Hash)
    nil
  else
    name
  end
end

#params_from_args(args) ⇒ Object



378
379
380
381
382
383
# File 'lib/bindata/dsl.rb', line 378

def params_from_args(args)
  name, params = args
  params = name if name.is_a?(Hash)

  params || {}
end

#params_from_block(&block) ⇒ Object



385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
# File 'lib/bindata/dsl.rb', line 385

def params_from_block(&block)
  bindata_classes = {
    :array      => BinData::Array,
    :buffer     => BinData::Buffer,
    :choice     => BinData::Choice,
    :delayed_io => BinData::DelayedIO,
    :skip       => BinData::Skip,
    :struct     => BinData::Struct,
  }

  if bindata_classes.include?(@type)
    parser = DSLParser.new(bindata_classes[@type], @type)
    parser.endian(@hints[:endian])
    parser.search_prefix(*@hints[:search_prefix])
    parser.instance_eval(&block)

    parser.dsl_params
  else
    {}
  end
end

#params_from_field_declaration(args, &block) ⇒ Object



368
369
370
371
372
373
374
375
376
# File 'lib/bindata/dsl.rb', line 368

def params_from_field_declaration(args, &block)
  params = params_from_args(args)

  if block_given?
    params.merge(params_from_block(&block))
  else
    params
  end
end