generate method

  1. @override
FutureOr<String?> generate(
  1. LibraryReader library,
  2. BuildStep buildStep
)

Generates Dart code for an input Dart library.

May create additional outputs through the buildStep, but the 'primary' output is Dart code returned through the Future. If there is nothing to generate for this library may return null, or a Future that resolves to null or the empty string.

Implementation

@override
FutureOr<String?> generate(LibraryReader library, BuildStep buildStep) async {
  // Collect models from the current library
  final models = _collectModels(library);
  if (models.isEmpty) return null; // Skip if no models found

  // Input file path (e.g., lib/models/user.dart)
  final inputPath = buildStep.inputId.path;

  // Build the output file path (e.g., lib/models/generated/user.g.dart)
  final sourceDir = path.dirname(inputPath);
  final generatedDir = path.join(sourceDir, 'generated');
  final fileName = path.basenameWithoutExtension(inputPath);
  final outputFileName = '$fileName.g.dart';
  final outputPath = path.join(generatedDir, outputFileName);

  // Ensure the `generated/` directory exists
  final generatedDirectory = Directory(generatedDir);
  if (!generatedDirectory.existsSync()) {
    await generatedDirectory.create(recursive: true);
  }

  // Build the generated output
  final output = StringBuffer()
    ..writeln('// GENERATED CODE - DO NOT MODIFY BY HAND')
    ..writeln()
    ..writeln('import "../$fileName.dart";')
    ..writeln();

  // Add serializers for each model class
  for (final model in models) {
    output.writeln(_generateModelSerializer(model));
  }

  // Write the generated file
  final outputFile = File(outputPath);
  await outputFile.writeAsString(output.toString());

  // Return null to avoid build_runner writing its own file
  return null;
}