recurseFieldValidation(
    documentSubset,
    collectionSpecSubset,
    strictness,
    errorMessages,
    verbose,
  ) {
    if (strictness) {
      for (const field of Object.keys(documentSubset)) {
        if (!collectionSpecSubset[field]) {
          const error = new Error("strictness");
          error.details = { field };
          throw error;
        }
      }
    }

    if (!verbose) {
      // We stop as soon as one field is not valid
      return Object.keys(collectionSpecSubset).every((fieldName) =>
        this.isValidField(
          fieldName,
          documentSubset,
          collectionSpecSubset,
          strictness,
          errorMessages,
          verbose,
        ),
      );
    }

    // We try to validate every field in order to get all error messages if any
    return Object.keys(collectionSpecSubset).reduce(
      (reductionResult, fieldName) =>
        this.isValidField(
          fieldName,
          documentSubset,
          collectionSpecSubset,
          strictness,
          errorMessages,
          verbose,
        ) && reductionResult,
      true,
    );
  }
@param {*} documentSubset
@param {StructuredFieldSpecification} collectionSpecSubset
@param {boolean} strictness
@param {string[]} errorMessages
@param {boolean} verbose