generateTokenSetEnum function
Generates an enum with all available token sets.
If the set contains light it will be set as light themeData. If the set contains dark it will be set as dark themeData. If light or dark is not in the set name the first set is chosen.
E.g.
// tokenSets = ['light', 'dark', 'allyLight'] is transformed to:
enum GeneratedTokenSet {
general(BrightnessAdapted(dark: DarkThemeData(), light: LightThemeData()),
ally(BrightnessAdapted(dark: AllyLightThemeData(), light: AllyLightThemeData());
const GeneratedTokenSet(this.data);
final BrightnessAdapted<GeneratedThemeData> data;
}
Implementation
String generateTokenSetEnum(
List<String> tokenSets, {
required BuilderConfig config,
}) {
var cases = <String>[];
tokenSets.remove(config.defaultSetName);
final tokenSetsString = tokenSets.join(',');
final regex = RegExp(r'\b(\w*)(?:light|dark|Light|Dark)\w*\b');
final matches = regex.allMatches(tokenSetsString);
final nonMatchedSets =
tokenSets.where((set) => !matches.any((match) => match.group(0) == set));
// List of tuples containing all prefixes for topics.
// Tuple: (prefix, initial match)
final prefixes = [
...matches.map((match) => Tuple2(match.group(1), match.group(0))),
...nonMatchedSets.map((noMatch) => Tuple2(noMatch, noMatch))
];
// A list of all unique prefixes.
final uniquePrefixes = prefixes.map((e) => e.item1).toSet().toList();
for (final uniquePrefix in uniquePrefixes) {
final themeMatches =
prefixes.where((element) => element.item1 == uniquePrefix);
final themes =
themeMatches.map((e) => '${e.item2?.firstUpperCased}ThemeData()');
final lightTheme = themes.firstWhere(
(element) => element.contains('Light'),
orElse: () => themes.first,
);
final darkTheme = themes.firstWhere(
(element) => element.contains('Dark'),
orElse: () => themes.first,
);
final set = (uniquePrefix?.isEmpty ?? true) ? 'general' : uniquePrefix;
cases.add(
'$set(BrightnessAdapted(\n${indentation(
level: 2,
)}dark: $darkTheme,\n${indentation(
level: 2,
)}light: $lightTheme,\n${indentation(level: 1)}))',
);
}
return '''enum GeneratedTokenSet {
${cases.join(',\n ')};
const GeneratedTokenSet(this.data);
final BrightnessAdapted<GeneratedThemeData> data;
}''';
}