Card.fromString constructor

Card.fromString({
  1. required String string,
  2. required CardType cardType,
})

Implementation

factory Card.fromString({
  required String string,
  required CardType cardType,
}) {
  Card? getCardFromRegExp(RegExp reg) {
    final match = reg.firstMatch(string);
    if (match == null) return null;
    final quantity = int.parse(match.group(1)!);
    final name = match.group(2)!.trim();
    final set = match.group(3)!;
    final code = match.group(4)!;
    return Card(
      quantity: quantity,
      name: name,
      set: set,
      code: code,
      cardType: cardType,
    );
  }

  Card? getEnergyFromRegExp(RegExp reg) {
    final match = reg.firstMatch(string);
    if (match == null) return null;

    final quantity = int.parse(match.group(1)!);
    final name = match.group(2)!;

    return Card(
      quantity: quantity,
      name: name,
      set: '',
      code: '',
      cardType: cardType,
    );
  }

  final regExp = RegExp(r'(\d+)\s+(.+?)\s+([A-Z]+)\s+(\d+)');
  final energyRegExp = RegExp(r'(\d+)\s+.+?\s+\{([A-Z0-9]+)\}');

  final card = switch (cardType) {
    CardType.pokemon => getCardFromRegExp(regExp),
    CardType.trainer => getCardFromRegExp(regExp),
    CardType.energy =>
      getCardFromRegExp(regExp) ?? getEnergyFromRegExp(energyRegExp),
  };

  if (card == null) {
    throw Exception('Could not parse card.');
  }

  return card;
}