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 all DTO imports required for body parsing
await resolveBodyImports(buildStep);
final endpoints = _collectEndpoints(library);
if (endpoints.isEmpty) return null; // nothing to generate
// Prepare paths for generated file
final inputPath = buildStep.inputId.path;
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 generated directory exists
final generatedDirectory = Directory(generatedDir);
if (!generatedDirectory.existsSync()) {
await generatedDirectory.create(recursive: true);
}
// Generate router configs for each endpoint
final endpointCodes = endpoints
.map(_generateEndpointRouter)
.toList(growable: false);
final output = StringBuffer()
..writeln('// GENERATED CODE - DO NOT MODIFY BY HAND')
..writeln()
..writeln('import "dart:convert";')
..writeln('import "package:sarus/sarus.dart";')
..writeln()
..writeln('import "../$fileName.dart";')
..writeln();
for (final import in _imports) {
output.writeln('import "package:$import";');
}
output.writeln();
output.writeAll(endpointCodes);
// Write generated file
final outputFile = File(outputPath);
await outputFile.writeAsString(output.toString());
// Return null so build_runner doesn't create its own file
return null;
}