def validate(params, values, path=nil)
return [ErrorData.new(:invalid_type, path, 'Hash')] unless values.respond_to?(:keys)
required_keys = params.select(&:required?).map(&:name)
given_keys = values.keys.select { |par| !values[par].nil? }.map(&:to_s)
missing_params = required_keys - given_keys
errors = missing_params.map { |p| ErrorData.new(:missing_argument, add_to_path(path, p)) }
values.each do |param, value|
param_description = params.find { |p| p.name == param.to_s }
if param_description
if !param_description.params.empty? && !value.nil?
if param_description.expected_type == :array
value.each.with_index do |item, i|
errors += validate(param_description.params, item, add_to_path(path, param_description.name, i))
end
end
if param_description.expected_type == :hash
errors += validate(param_description.params, value, add_to_path(path, param_description.name))
end
end
end
end
errors
end