protectEnumItemsNames function

Set<UniversalEnumItem> protectEnumItemsNames(
  1. Iterable<String> names
)

Protect enum items names from incorrect symbols, keywords, etc.

Implementation

Set<UniversalEnumItem> protectEnumItemsNames(Iterable<String> names) {
  var counter = 0;
  final items = <UniversalEnumItem>{};

  String uniqueEnumItemName() {
    final newName = 'undefined $counter';
    counter++;
    return newName;
  }

  String numberEnumItemName(String name) {
    final startsWithMinus = name.startsWith('-');
    final newName = 'value ${startsWithMinus ? 'minus' : ''} $name';
    return newName;
  }

  String leadingDashToMinus(String name) {
    if (name.startsWith('-')) {
      return 'minus ${name.substring(1)}';
    }
    return name;
  }

  for (final name in names) {
    final (newName, renameDescription) = switch (name) {
      _
          when _startWithNumberRegExp.hasMatch(name) &&
              _enumNameRegExp.hasMatch(numberEnumItemName(name).toCamel) =>
        (numberEnumItemName(name), null),
      _ when !_enumNameRegExp.hasMatch(name) => (
          uniqueEnumItemName(),
          'Incorrect name has been replaced. Original name: `$name`.',
        ),
      _ when dartEnumMemberKeywords.contains(name.toCamel) => (
          '$_valueConst ${leadingDashToMinus(name)}',
          'The name has been replaced because it contains a keyword. Original name: `$name`.',
        ),
      _ => (leadingDashToMinus(name), null),
    };
    items.add(
      UniversalEnumItem(
        name: newName,
        jsonKey: name,
        description: renameDescription,
      ),
    );
  }

  return items;
}