validate method

ValidationResult validate({
  1. required Credential<Claim> credential,
  2. required DcqlQuery query,
  3. required int credentialIndex,
})

Implementation

ValidationResult validate({
  required Credential credential,
  required DcqlQuery query,
  required int credentialIndex,
}) {
  if (credential.claimSets == null) {
    return ValidationResult.valid();
  }

  // OPTIONAL. A non-empty array containing arrays of identifiers for elements in claims that specifies which combinations of claims for the Credential are requested. The rules for selecting claims to send are defined in Section 6.4.1.
  if (credential.claimSets != null) {
    for (var j = 0; j < credential.claimSets!.length; j++) {
      final claimSet = credential.claimSets![j];
      final contextPath =
          'query.credentials[$credentialIndex].claim_sets[$j]';

      if (claimSet.isEmpty) {
        return ValidationResult.invalid(
          contextPath: contextPath,
          errors: ['Claim set cannot be an empty list.'],
        );
      }

      for (var k = 0; k < claimSet.length; k++) {
        final claimId = claimSet[k];
        final contextPathElement = '$contextPath[$k]';

        final matchingClaim = credential.claims?.cast<Claim?>().firstWhere(
              (claim) => claim?.id == claimId,
              orElse: () => null,
            );

        if (matchingClaim == null) {
          return ValidationResult.invalid(
            contextPath: contextPathElement,
            errors: [
              'Claim ID "$claimId" in claim set does not match any claim in the credential.',
            ],
          );
        }
      }
    }
  }

  return ValidationResult.valid();
}