QrValidationResult.fromPayload constructor

QrValidationResult.fromPayload({
  1. required QrPayload payload,
  2. required int typeNumber,
  3. required QrErrorCorrectLevel errorCorrectLevel,
})

Implementation

factory QrValidationResult.fromPayload({
  required QrPayload payload,
  required int typeNumber,
  required QrErrorCorrectLevel errorCorrectLevel,
}) {
  RangeError.checkValueInInterval(typeNumber, 1, 40, "typeNumber");

  final int requiredBitsFor1 = payload.calculateRequiredBits(1);
  final int requiredBitsFor10 = payload.calculateRequiredBits(10);
  final int requiredBitsFor27 = payload.calculateRequiredBits(27);

  int getRequiredBits(int type) {
    if (type < 10) return requiredBitsFor1;
    if (type < 27) return requiredBitsFor10;
    return requiredBitsFor27;
  }

  final List<int> validTypes = <int>[];
  for (int type = 1; type <= 40; type++) {
    final int required = getRequiredBits(type);
    final int capacity = QrRsBlock.getTotalDataBits(type, errorCorrectLevel);
    if (required <= capacity) {
      for (int t = type; t <= 40; t++) {
        validTypes.add(t);
      }
      break;
    }
  }

  final List<QrErrorCorrectLevel> validErrorLevels = <QrErrorCorrectLevel>[];
  for (final QrErrorCorrectLevel level in QrErrorCorrectLevel.values) {
    final int requiredForType = getRequiredBits(typeNumber);
    final int capacity = QrRsBlock.getTotalDataBits(typeNumber, level);
    if (requiredForType <= capacity) {
      validErrorLevels.add(level);
    }
  }

  QrCode? code;
  if (validTypes.contains(typeNumber) && validErrorLevels.contains(errorCorrectLevel)) {
    code = QrCode(
      payload: payload,
      errorCorrectLevel: errorCorrectLevel,
      minTypeNumber: typeNumber,
    );
  }

  return QrValidationResult._(
    qrCode: code,
    validTypeNumbers: List<int>.unmodifiable(validTypes),
    validErrorCorrectLevels: List<QrErrorCorrectLevel>.unmodifiable(validErrorLevels),
  );
}