fromQrCode method

EUDigitalCovidCertificate? fromQrCode(
  1. String raw
)

Implementation

EUDigitalCovidCertificate? fromQrCode(String raw) {
  // Decode the QRCode
  var parts = _extract(raw);

  // Check for the signature
  var check = _check(parts);

  // Extract data and parse content
  var c = Cbor();
  c.decodeFromBuffer(parts.payload);
  var payload = c.getDecodedData()![0];

  // Extract content
  var issuer = payload[1];
  var issuedAt = DateTime.fromMicrosecondsSinceEpoch(payload[6] * 1000000);
  var expiresAt = DateTime.fromMicrosecondsSinceEpoch(payload[4] * 1000000);
  var certificates = payload[-260].values.toList();

  List<Certificate> certs = [];
  certificates.forEach((cert) {
    _mapConvert(Map<dynamic, dynamic> m) {
      Map<String, dynamic> json = {};
      m.forEach((key, value) {
        if (key is! String) {
          return;
        }
        if (value is Map<dynamic, dynamic>) {
          value = _mapConvert(value);
        }
        if (value is List<dynamic>) {
          value = value.map((v) {
            if (v is Map<dynamic, dynamic>) {
              v = _mapConvert(v);
            }
            return v;
          }).toList();
        }
        json[key] = value;
      });
      return json;
    }

    var j = _mapConvert(cert);
    certs.add(Certificate.fromJson(j));
  });

  return EUDigitalCovidCertificate(
    qr: raw,
    issuer: countryFromJson(issuer),
    issuedAt: issuedAt,
    expiresAt: expiresAt,
    certificates: certs,
    check: check,
  );
}