code: def validate(validation, dictionary):
      
  
      errors = defaultdict(list)
      for key in validation:
          if isinstance(validation[key], (list, tuple)):
              if Required in validation[key]:
                  if not Required(key, dictionary):
                      errors[key] = ["must be present"]
                      continue
              _validate_list_helper(validation, dictionary, key, errors)
          else:
              v = validation[key]
              if v == Required:
                  if not Required(key, dictionary):
                      errors[key] = ["must be present"]
              else:
                  _validate_and_store_errs(v, dictionary, key, errors)
      if len(errors) > 0:
          # `errors` gets downgraded from defaultdict to dict
          # because it makes for prettier output
          return ValidationResult(valid=False, errors=dict(errors))
      else:
          return ValidationResult(valid=True, errors={})
docs: Validate that a dictionary passes a set of
      key-based validators. If all of the keys
      in the dictionary are within the parameters
      specified by the validation mapping, then
      the validation passes.
  
      :param validation: a mapping of keys to validators
      :type validation: dict
  
      :param dictionary: dictionary to be validated
      :type dictionary: dict
  
      :return: a tuple containing a bool indicating
      success or failure and a mapping of fields
      to error messages.