generate method

Future<void> generate()

Implementation

Future<void> generate() async {
  final outputDir = config.outputDirectory;
  final dbFileName = config.databaseName;

  final List<_MigrationInfo> foundMigrations = [];
  final fullMigrationsPath = p.join(
    outputDir,
    config.sqliteMigrationsSubDir,
  ); // Corrected
  final migrationsDir = Directory(fullMigrationsPath);

  if (await migrationsDir.exists()) {
    try {
      final entities = await migrationsDir.list().toList();
      for (final entity in entities) {
        if (entity is File) {
          final filename = p.basename(entity.path);
          final match = _migrationFileRegex.firstMatch(filename);
          if (match != null) {
            final versionStr = match.group(1)!; // e.g., "0000"
            final suffixIdentifier = match.group(
              2,
            ); // e.g., "core_feed" or null
            try {
              final version = int.parse(versionStr);
              foundMigrations.add(
                _MigrationInfo(
                  version: version,
                  versionPadded: versionStr,
                  suffixIdentifier: suffixIdentifier,
                  fileNameWithExtension: filename,
                ),
              );
            } catch (e) {
              _logger.warning(
                'Could not parse version from migration filename: $filename',
              );
            }
          }
        }
      }
      foundMigrations.sort(); // Sort by version
      if (foundMigrations.isNotEmpty) {
        _logger.info(
          'Found ${foundMigrations.length} migrations. Latest version: ${foundMigrations.last.version}',
        );
      } else {
        _logger.info('No migrations found in ${migrationsDir.path}.');
      }
    } catch (e) {
      _logger.severe(
        'Error scanning migrations directory ${migrationsDir.path}: $e',
      );
    }
  } else {
    _logger.warning(
      'Migrations directory ${migrationsDir.path} not found. Assuming no migrations.',
    );
  }

  final int latestNumericVersion =
      foundMigrations.isNotEmpty ? foundMigrations.last.version : 0;

  final interfaceContent = _generateInterfaceFileContent();
  final nativeContent = _generateNativeFileContent(
    dbFileName,
    foundMigrations,
    config.sqliteMigrationsSubDir,
  ); // Corrected
  final webContent = _generateWebFileContent(
    dbFileName,
    foundMigrations,
    config.sqliteMigrationsSubDir,
  ); // Corrected
  final mainDbContent = _generateMainDatabaseFileContent(
    latestNumericVersion,
  ); // Pass latestNumericVersion if needed by sqflite_common_ffi_web

  await _writeFile(
    p.join(outputDir, _interfaceFileName),
    interfaceContent,
    'Interface',
  );
  await _writeFile(
    p.join(outputDir, _nativeFileName),
    nativeContent,
    'Native DB',
  );
  await _writeFile(p.join(outputDir, _webFileName), webContent, 'Web DB');
  await _writeFile(
    p.join(outputDir, _mainDbFileName),
    mainDbContent,
    'Main DB',
  );

  _logger.info(
    'Database files generated successfully in directory: $outputDir',
  );
}