class BinData::Struct
def sanitize_parameters!(sanitizer, params)
def sanitize_parameters!(sanitizer, params) # possibly override endian endian = params[:endian] if endian != nil unless [:little, :big].include?(endian) raise ArgumentError, "unknown value for endian '#{endian}'" end params[:endian] = endian end if params.has_key?(:fields) sanitizer.with_endian(endian) do # ensure names of fields are strings and that params is sanitized all_fields = params[:fields].collect do |ftype, fname, fparams| fname = fname.to_s klass = sanitizer.lookup_klass(ftype) sanitized_fparams = sanitizer.sanitize_params(klass, fparams) [klass, fname, sanitized_fparams] end params[:fields] = all_fields end # now params are sanitized, check that parameter names are okay field_names = [] instance_methods = self.instance_methods reserved_names = RESERVED params[:fields].each do |fklass, fname, fparams| # check that name doesn't shadow an existing method if instance_methods.include?(fname) raise NameError.new("Rename field '#{fname}' in #{self}, " + "as it shadows an existing method.", fname) end # check that name isn't reserved if reserved_names.include?(fname) raise NameError.new("Rename field '#{fname}' in #{self}, " + "as it is a reserved name.", fname) end # check for multiple definitions if field_names.include?(fname) raise NameError.new("field '#{fname}' in #{self}, " + "is defined multiple times.", fname) end field_names << fname end # collect all hidden names that correspond to a field name hide = [] if params.has_key?(:hide) hidden = (params[:hide] || []).collect { |h| h.to_s } all_field_names = params[:fields].collect { |k,n,p| n } hide = hidden & all_field_names end params[:hide] = hide end super(sanitizer, params) end