blob: aa392b3d1b4046be74bc92a8cca881dd9c1a2ce1 [file] [log] [blame] [edit]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:io';
import 'package:messages_serializer/messages_serializer.dart';
import 'package:path/path.dart' as p;
import 'builder.dart';
import 'generation_options.dart';
import 'message_file.dart';
class MessageDataFileBuilder {
final Directory inputFolder;
final Directory outputFolder;
final GenerationOptions options;
MessageDataFileBuilder({
required this.inputFolder,
required this.outputFolder,
required this.options,
});
Future<Map<String, String>> run() async {
print('Starting to add arb files from $inputFolder to $outputFolder');
final arbFiles = await inputFolder
.list()
.where((file) => file is File)
.map((file) => file.path)
.where((path) => p.extension(path) == '.arb')
.toList();
final mapping = <String, String>{};
if (arbFiles.isEmpty) {
print('No `.arb` files found in $inputFolder.');
return mapping;
}
for (final arbFilePath in arbFiles) {
print('Generating $arbFilePath, bundle this in your assets.');
final arbFileUri = Uri.file(arbFilePath);
final arbFileContents = await File.fromUri(arbFileUri).readAsString();
final messageBundle = await parseMessageFile(arbFileContents, options);
final serializer = JsonSerializer(options.findById);
final data = _arbToData(messageBundle, arbFilePath, serializer);
final assetName = p.setExtension(
p.basename(arbFilePath),
'.arb${serializer.extension}',
);
final outputDataPath = outputFolder.uri.resolve(assetName);
final dataFile = File.fromUri(outputDataPath);
await dataFile.create();
await dataFile.writeAsString(data);
mapping[arbFilePath] = outputDataPath.path;
}
return mapping;
}
String _arbToData(
MessageFile messageBundle,
String arbFilePath,
Serializer<String> serializer,
) =>
serializer
.serialize(
messageBundle.hash,
messageBundle.locale ?? 'en_US',
messageBundle.messages.map((e) => e.message).toList(),
)
.data;
}