emit static method

SwayEmitResult emit(
  1. List<ParsedLocaleFile> localeFiles, {
  2. required SwayConfig config,
})

Emits a main library + one part file per locale.

Keys are basenames relative to the output directory of config.outputFile.

Implementation

static SwayEmitResult emit(
  List<ParsedLocaleFile> localeFiles, {
  required SwayConfig config,
}) {
  if (localeFiles.isEmpty) {
    throw StateError('No locale files to emit');
  }

  final sorted = [...localeFiles]
    ..sort((a, b) => a.languageCode.compareTo(b.languageCode));

  final base = sorted.firstWhere(
    (f) => f.languageCode == config.baseLocale,
    orElse: () => sorted.first,
  );

  final mainName = p.basename(config.outputFile);
  final stem = _stem(mainName); // "sway" from "sway.g.dart"

  final files = <String, String>{};
  final partNames = <String>[];

  for (final file in sorted) {
    final partName = '${stem}_${file.languageCode}.g.dart';
    partNames.add(partName);
    final partBuf = StringBuffer();
    partBuf.writeln('// GENERATED FILE — DO NOT EDIT');
    partBuf.writeln(
      '// Generated by Sway — To regenerate, run: dart run sway:codegen',
    );
    partBuf.writeln();
    partBuf.writeln("part of '$mainName';");
    partBuf.writeln();
    _emitLocaleImpl(partBuf, file, base, config);
    files[partName] = partBuf.toString();
  }

  final mainBuf = StringBuffer();
  mainBuf.writeln('// GENERATED FILE — DO NOT EDIT');
  mainBuf.writeln(
    '// Generated by Sway — To regenerate, run: dart run sway:codegen',
  );
  mainBuf.writeln();
  mainBuf.writeln("import 'package:flutter/widgets.dart';");
  mainBuf.writeln(
    "import 'package:sway/sway.dart' show PluralCategory, resolvePlural;",
  );
  mainBuf.writeln();
  for (final partName in partNames) {
    mainBuf.writeln("part '$partName';");
  }
  mainBuf.writeln();

  _emitNestedAbstracts(mainBuf, base.data, '');
  _emitRootAbstract(mainBuf, base, sorted);

  files[mainName] = mainBuf.toString();
  return SwayEmitResult(files);
}