build method
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(', ')}',
);
}