class BinData::StructArgProcessor

def ensure_field_names_are_valid(obj_class, field_names)

def ensure_field_names_are_valid(obj_class, field_names)
  reserved_names = BinData::Struct::RESERVED
  field_names.each do |name|
    if obj_class.method_defined?(name)
      raise NameError.new("Rename field '#{name}' in #{obj_class}, " \
                          "as it shadows an existing method.", name)
    end
    if reserved_names.include?(name)
      raise NameError.new("Rename field '#{name}' in #{obj_class}, " \
                          "as it is a reserved name.", name)
    end
    if field_names.count(name) != 1
      raise NameError.new("field '#{name}' in #{obj_class}, " \
                          "is defined multiple times.", name)
    end
  end
end

def hidden_field_names(hidden)

def hidden_field_names(hidden)
  (hidden || []).collect(&:to_sym)
end

def sanitize_endian(params)

def sanitize_endian(params)
  params.sanitize_endian(:endian)
end

def sanitize_fields(obj_class, params)

def sanitize_fields(obj_class, params)
  params.sanitize_fields(:fields) do |fields, sanitized_fields|
    fields.each do |ftype, fname, fparams|
      sanitized_fields.add_field(ftype, fname, fparams)
    end
    field_names = sanitized_field_names(sanitized_fields)
    ensure_field_names_are_valid(obj_class, field_names)
  end
end

def sanitize_hide(params)

def sanitize_hide(params)
  params.sanitize(:hide) do |hidden|
    field_names  = sanitized_field_names(params[:fields])
    hfield_names = hidden_field_names(hidden)
    hfield_names & field_names
  end
end

def sanitize_parameters!(obj_class, params)

def sanitize_parameters!(obj_class, params)
  sanitize_endian(params)
  sanitize_search_prefix(params)
  sanitize_fields(obj_class, params)
  sanitize_hide(params)
end

def sanitize_search_prefix(params)

def sanitize_search_prefix(params)
  params.sanitize(:search_prefix) do |sprefix|
    search_prefix = Array(sprefix).collect do |prefix|
      prefix.to_s.chomp("_")
    end
    search_prefix - [""]
  end
end

def sanitized_field_names(sanitized_fields)

def sanitized_field_names(sanitized_fields)
  sanitized_fields.field_names.compact
end