generateAssetsUtils function

Future<void> generateAssetsUtils()

Generate AssetsUtils Dart file with extensions grouped and unique variable names

Implementation

Future<void> generateAssetsUtils() async {
  ConsoleLog.title('Generating AssetsUtils');
  final start = DateTime.now();

  DartgenxConfig config = DartgenxConfig.load();

  final assetsFolder = p.join(Directory.current.path, config.inputPath?.assets ?? 'assets');
  final files = fetchAssetsFiles(assetsFolder);

  if (files.isEmpty) {
    ConsoleLog.error('No assets found. Skipping generation.');
    return;
  }

  final buffer = StringBuffer();
  buffer.writeln('/*');
  buffer.writeln(
      ' * Created by DartGenX CLI tool on ${DateFormat('EEE, dd MMM yyyy, h:mm a').format(DateTime.now())}');
  buffer.writeln(' */');
  buffer.writeln('');
  buffer.writeln('class AssetsUtils {');
  buffer.writeln('  AssetsUtils._();\n');

  // Group files by extension
  final grouped = <String, List<Map<String, String>>>{};
  for (var file in files) {
    final ext = file['extension']!;
    grouped.putIfAbsent(ext, () => []).add(file);
  }

  // Track used variable names to avoid duplicates
  final usedNames = <String>{};

  final sortedExtensions = grouped.keys.toList()..sort();
  for (var ext in sortedExtensions) {
    buffer.writeln('  // ---------- $ext files ----------');
    for (var file in grouped[ext]!) {
      var varName = file['name']!;
      var counter = 1;
      while (usedNames.contains(varName)) {
        varName = '${file['name']}_$counter';
        counter++;
      }
      usedNames.add(varName);
      buffer.writeln('  static const String $varName = "${file['path']}";');
    }
    buffer.writeln('');
  }

  buffer.writeln('}');

  // Write to file
  final outputFile = File(config.outputPath?.assetsUtils ?? 'lib/assets_utils.dart');

  outputFile.createSync(recursive: true);

  outputFile.writeAsStringSync(buffer.toString());

  ConsoleLog.success(
      'AssetsUtils generated with ${files.length} assets at ${config.outputPath?.assetsUtils ?? 'lib/assets_utils.dart'}');

  final duration = DateTime.now().difference(start).inMilliseconds;
  ConsoleLog.info('⌚ Completed in ${duration}ms');
  ConsoleLog.line();
}