build method

  1. @override
Future<void> build(
  1. BuildStep buildStep
)

Generates the outputs for a given BuildStep.

Implementation

@override
Future<void> build(BuildStep buildStep) async {
  final config = await _loadConfig(buildStep);
  if (config == null) {
    log.fine('No excel_translator section in pubspec.yaml — skipping');
    return;
  }

  final sourceFiles =
      config.files ??
      (config.excelFilePath == null ? null : [config.excelFilePath!]);
  if (sourceFiles == null) {
    log.warning(
      'excel_translator.excel_file or excel_translator.files not specified in pubspec.yaml',
    );
    return;
  }

  final sheets = await _inputService.parseFiles(
    sourceFiles,
    deriveCsvModuleNames: config.files != null,
    languageService: LanguageService(
      logInfo: log.info,
      logWarning: log.warning,
    ),
    loadBytes: (filePath) async {
      final asset = AssetId(buildStep.inputId.package, filePath);
      if (!await buildStep.canRead(asset)) {
        throw FileNotFoundException(filePath);
      }
      // Reading registers every source as an implicit dependency.
      return buildStep.readAsBytes(asset);
    },
  );

  if (sheets.isEmpty) {
    log.warning('No sheets found in ${sourceFiles.join(', ')}');
    return;
  }

  sheets.sort((a, b) => a.name.compareTo(b.name));

  final outputDir = _outputDir;
  final className = config.className ?? 'AppLocalizations';
  final includeDelegates = config.includeFlutterDelegates ?? true;

  // ── generated_localizations.dart ─────────────────────────────────────────
  // Inline mode: sheet classes + main class in one file (no per-sheet imports).
  final mainBuffer = StringBuffer();

  // 1. File header + Flutter imports
  mainBuffer.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND');
  mainBuffer.writeln('// Generated by Excel Translator');
  mainBuffer.writeln('// ignore_for_file: type=lint');
  mainBuffer.writeln();
  if (includeDelegates) {
    mainBuffer.writeln("import 'package:flutter/material.dart';");
    mainBuffer.writeln("import 'package:flutter/cupertino.dart';");
    mainBuffer.writeln(
      "import 'package:excel_translator/excel_translator.dart';",
    );
    mainBuffer.writeln("import 'dart:ui' show PlatformDispatcher;");
    mainBuffer.writeln();
  }

  // 2. Sheet class bodies (inlined — no separate files, no import lines)
  for (final sheet in sheets) {
    mainBuffer.write(_sheetGenerator.generateClassBody(sheet));
    mainBuffer.writeln();
  }

  // 3. Main class + delegate (shares logic with CLI, just no imports block)
  mainBuffer.write(
    _mainGenerator.generateClassAndDelegate(
      sheets,
      className,
      includeDelegates,
    ),
  );

  await buildStep.writeAsString(
    AssetId(
      buildStep.inputId.package,
      '$outputDir/generated_localizations.dart',
    ),
    mainBuffer.toString(),
  );

  // ── build_context_extension.dart ─────────────────────────────────────────
  await buildStep.writeAsString(
    AssetId(
      buildStep.inputId.package,
      '$outputDir/build_context_extension.dart',
    ),
    _extensionGenerator.generateContent(className),
  );

  log.info(
    'excel_translator: generated localizations from ${sourceFiles.join(', ')}',
  );
}