# File lib/apipie_bindings/action.rb, line 73
    def validate(params, values, path=nil)
      return [ErrorData.new(:invalid_type, path, 'Hash')] unless values.respond_to?(:keys)
      # check required
      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)) }

      # check individuals one by one
      values.each do |param, value|
        param_description = params.find { |p| p.name == param.to_s }
        if param_description
        
          # nested?
          if !param_description.params.empty? && !value.nil?
            # array
            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
            # hash
            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