validate method

ValidationResult validate(
  1. DcqlQuery query
)

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();
}