generate method
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;
}