Class: BinData::DSLMixin::DSLFieldValidator

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

Overview

Validates a field defined in a DSLMixin.

Instance Method Summary collapse

Constructor Details

#initialize(the_class, parser) ⇒ DSLFieldValidator

Returns a new instance of DSLFieldValidator.



407
408
409
410
# File 'lib/bindata/dsl.rb', line 407

def initialize(the_class, parser)
  @the_class = the_class
  @dsl_parser = parser
end

Instance Method Details

#all_or_none_names_failed?(name) ⇒ Boolean

Returns:

  • (Boolean)


456
457
458
459
460
461
462
463
464
465
# File 'lib/bindata/dsl.rb', line 456

def all_or_none_names_failed?(name)
  if option?(:all_or_none_fieldnames) and not fields.empty?
    all_names_blank = fields.all_field_names_blank?
    no_names_blank = fields.no_field_names_blank?

    (name != nil and all_names_blank) or (name == nil and no_names_blank)
  else
    false
  end
end

#duplicate_name?(name) ⇒ Boolean

Returns:

  • (Boolean)


471
472
473
# File 'lib/bindata/dsl.rb', line 471

def duplicate_name?(name)
  fields.has_field_name?(name)
end

#ensure_valid_name(name) ⇒ Object



428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
# File 'lib/bindata/dsl.rb', line 428

def ensure_valid_name(name)
  if name and not option?(:fieldnames_are_values)
    if malformed_name?(name)
      raise NameError.new("", name), "field '#{name}' is an illegal fieldname"
    end

    if duplicate_name?(name)
      raise SyntaxError, "duplicate field '#{name}'"
    end

    if name_shadows_method?(name)
      raise NameError.new("", name), "field '#{name}' shadows an existing method"
    end

    if name_is_reserved?(name)
      raise NameError.new("", name), "field '#{name}' is a reserved name"
    end
  end
end

#fieldsObject



483
484
485
# File 'lib/bindata/dsl.rb', line 483

def fields
  @dsl_parser.fields
end

#malformed_name?(name) ⇒ Boolean

Returns:

  • (Boolean)


467
468
469
# File 'lib/bindata/dsl.rb', line 467

def malformed_name?(name)
  /^[a-z_]\w*$/ !~ name.to_s
end

#must_have_a_name_failed?(name) ⇒ Boolean

Returns:

  • (Boolean)


452
453
454
# File 'lib/bindata/dsl.rb', line 452

def must_have_a_name_failed?(name)
  option?(:mandatory_fieldnames) and name.nil?
end

#must_not_have_a_name_failed?(name) ⇒ Boolean

Returns:

  • (Boolean)


448
449
450
# File 'lib/bindata/dsl.rb', line 448

def must_not_have_a_name_failed?(name)
  option?(:no_fieldnames) and name != nil
end

#name_is_reserved?(name) ⇒ Boolean

Returns:

  • (Boolean)


479
480
481
# File 'lib/bindata/dsl.rb', line 479

def name_is_reserved?(name)
  BinData::Struct::RESERVED.include?(name.to_sym)
end

#name_shadows_method?(name) ⇒ Boolean

Returns:

  • (Boolean)


475
476
477
# File 'lib/bindata/dsl.rb', line 475

def name_shadows_method?(name)
  @the_class.method_defined?(name)
end

#option?(opt) ⇒ Boolean

Returns:

  • (Boolean)


487
488
489
# File 'lib/bindata/dsl.rb', line 487

def option?(opt)
  @dsl_parser.send(:option?, opt)
end

#validate_field(name) ⇒ Object



412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
# File 'lib/bindata/dsl.rb', line 412

def validate_field(name)
  if must_not_have_a_name_failed?(name)
    raise SyntaxError, "field must not have a name"
  end

  if all_or_none_names_failed?(name)
    raise SyntaxError, "fields must either all have names, or none must have names"
  end

  if must_have_a_name_failed?(name)
    raise SyntaxError, "field must have a name"
  end

  ensure_valid_name(name)
end