class BinData::DSLMixin::DSLFieldValidator

Validates a field defined in a DSLMixin.

Public Class Methods

new(the_class, parser) click to toggle source
# File lib/bindata/dsl.rb, line 399
def initialize(the_class, parser)
  @the_class = the_class
  @dsl_parser = parser
end

Public Instance Methods

all_or_none_names_failed?(name) click to toggle source
# File lib/bindata/dsl.rb, line 448
def all_or_none_names_failed?(name)
  if option?(:all_or_none_fieldnames) && !fields.empty?
    all_names_blank = fields.all_field_names_blank?
    no_names_blank = fields.no_field_names_blank?

    (!name.nil? && all_names_blank) || (name.nil? && no_names_blank)
  else
    false
  end
end
duplicate_name?(name) click to toggle source
# File lib/bindata/dsl.rb, line 463
def duplicate_name?(name)
  fields.field_name?(name)
end
ensure_valid_name(name) click to toggle source
# File lib/bindata/dsl.rb, line 420
def ensure_valid_name(name)
  if name && !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
fields() click to toggle source
# File lib/bindata/dsl.rb, line 475
def fields
  @dsl_parser.fields
end
malformed_name?(name) click to toggle source
# File lib/bindata/dsl.rb, line 459
def malformed_name?(name)
  /^[a-z_]\w*$/ !~ name.to_s
end
must_have_a_name_failed?(name) click to toggle source
# File lib/bindata/dsl.rb, line 444
def must_have_a_name_failed?(name)
  option?(:mandatory_fieldnames) && name.nil?
end
must_not_have_a_name_failed?(name) click to toggle source
# File lib/bindata/dsl.rb, line 440
def must_not_have_a_name_failed?(name)
  option?(:no_fieldnames) && !name.nil?
end
name_is_reserved?(name) click to toggle source
# File lib/bindata/dsl.rb, line 471
def name_is_reserved?(name)
  BinData::Struct::RESERVED.include?(name.to_sym)
end
name_shadows_method?(name) click to toggle source
# File lib/bindata/dsl.rb, line 467
def name_shadows_method?(name)
  @the_class.method_defined?(name)
end
option?(opt) click to toggle source
# File lib/bindata/dsl.rb, line 479
def option?(opt)
  @dsl_parser.send(:option?, opt)
end
validate_field(name) click to toggle source
# File lib/bindata/dsl.rb, line 404
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