Card.fromString constructor

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

Implementation

factory Card.fromString({
  required String string,
  required CardType cardType,
}) {
  Card getCardFromMatch(RegExpMatch match) {
    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 getEnergyFromMatch(RegExpMatch match) {
    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 match = regExp.firstMatch(string);

  if (match != null) {
    return getCardFromMatch(match);
  } else {
    // if it fails to match, it needs to be an energy input this way
    // 3 Basic {D} Energy Energy 24 PH
    final energyRegExp = RegExp(r'(\d+)\s+.+?\s+\{([A-Z0-9]+)\}');

    final energyMatch = energyRegExp.firstMatch(string);

    if (energyMatch != null) {
      return getEnergyFromMatch(energyMatch);
    }

    throw Exception('Could not parse card.');
  }
}