validate method
Implementation
ValidationResult validate(DcqlQuery query) {
if (query.credentials.isEmpty) {
return ValidationResult.invalid(
contextPath: 'query.credentials',
errors: ['DCQL query must contain at least one credential'],
);
}
final seenIds = <String>{};
for (var i = 0; i < query.credentials.length; i++) {
var credential = query.credentials[i];
if (seenIds.contains(credential.id)) {
return ValidationResult.invalid(
contextPath: 'query.credentials[$i].id',
errors: ['Duplicate credential ID "${credential.id}" found'],
);
}
seenIds.add(credential.id);
// The id MUST be a non-empty string consisting of alphanumeric, underscore (_), or hyphen (-) characters
final idPattern = RegExp(r'^[a-zA-Z0-9_-]+$');
if (!idPattern.hasMatch(credential.id) || credential.id.isEmpty) {
return ValidationResult.invalid(
contextPath: 'query.credentials[$i].id',
errors: [
'Credential ID cannot be empty & must consist of alphanumeric, underscore (_), or hyphen (-) characters.',
],
);
}
// Additional credential validations can be added here
// Validate meta, for sd jwt should have vct_values, and mdoc should have doctype_value
// claims
if (credential.claims != null && credential.claims!.isEmpty) {
return ValidationResult.invalid(
contextPath: 'query.credentials[$i].claims',
errors: ['Credential claims cannot be an empty list if provided.'],
);
} else if (credential.claims != null) {
final claimValidationResult = _claimValidator.validate(
credential: credential,
query: query,
credentialIndex: i,
);
if (claimValidationResult.isInvalid) {
return claimValidationResult;
}
}
final claimSetValidationResult = _claimSetValidator.validate(
credential: credential,
query: query,
credentialIndex: i,
);
if (claimSetValidationResult.isInvalid) {
return claimSetValidationResult;
}
}
return ValidationResult.valid();
}