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