capabilities static method

EcrTerminalCapabilities capabilities(
  1. Object? payload
)

Reads a capabilities map.

Absent or unreadable gives an empty, unavailable terminal rather than a throw: a till that cannot read the profile must offer nothing, not everything.

Implementation

static EcrTerminalCapabilities capabilities(Object? payload) {
  final Map<Object?, Object?>? map = _asMap(payload);
  if (map == null) return const EcrTerminalCapabilities();

  final Object? mode = map[EcrCapabilityKeys.ecrMode];
  final int? ecrMode = mode is int ? mode : int.tryParse('${mode ?? ''}');

  final Object? entries = map[EcrCapabilityKeys.permittedTransactions];
  final List<EcrPermittedTransaction> permitted = <EcrPermittedTransaction>[];
  if (entries is List) {
    for (final Object? entry in entries) {
      final Map<Object?, Object?>? one = _asMap(entry);
      if (one == null) continue;
      final EcrTransactionType? type = _typeOf(
        _string(one, EcrCapabilityKeys.messageType),
      );
      // An operation this version has never heard of is dropped, not
      // guessed at. A till cannot offer a button it has no code for, and
      // inventing one would be worse than leaving it out.
      if (type == null) continue;
      permitted.add(
        EcrPermittedTransaction(
          type: type,
          minAmount: _string(one, EcrCapabilityKeys.minAmount),
          maxAmount: _string(one, EcrCapabilityKeys.maxAmount),
        ),
      );
    }
  }

  return EcrTerminalCapabilities(
    available: _bool(map, EcrCapabilityKeys.available),
    reason: _string(map, EcrCapabilityKeys.reason),
    transport: _transportOf(ecrMode),
    ecrMode: ecrMode,
    terminalName: _string(map, EcrCapabilityKeys.terminalName),
    currencyCode: _string(map, EcrCapabilityKeys.currencyCode),
    minorUnitDigits: _int(map, EcrCapabilityKeys.minorUnitDigits),
    eReceipt: _bool(map, EcrCapabilityKeys.eReceipt),
    physicalReceipt: _bool(map, EcrCapabilityKeys.physicalReceipt),
    permitted: permitted,
  );
}