class Object

Public Instance Methods

deep_symbolize() click to toggle source
# File lib/evva/object_extension.rb, line 2
def deep_symbolize
  case self
  when Array
    map(&:deep_symbolize)
  when Hash
    each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v.deep_symbolize; }
  else
    self
  end
end
validate_structure!(structure, error_prefix = []) click to toggle source
# File lib/evva/object_extension.rb, line 13
def validate_structure!(structure, error_prefix = [])
  return if nil? && structure[:optional]

  prepend_error = error_prefix.empty? ? '' : (['self'] + error_prefix + [': ']).join

  unless is_a? structure[:type]
    raise ArgumentError, "#{prepend_error}Expected #{structure[:type]}, got #{self.class}"
  end

  return unless structure[:elements]

  case self
  when Array
    each_with_index do |e, i|
      e.validate_structure!(structure[:elements], error_prefix + ["[#{i}]"])
    end
  when Hash
    mandatory_keys = structure[:elements].map { |k, s| k unless s[:optional] }.compact

    unless (missing = mandatory_keys - keys).empty?
      raise ArgumentError, "#{prepend_error}Missing keys: #{missing.join(', ')}"
    end

    structure[:elements].each do |key, structure|
      self[key].validate_structure!(structure, error_prefix + ["[:#{key}]"])
    end
  end
end