blob: 05710efb7c688be748af4fc8036225159a9d5107 [file] [log] [blame] [edit]
// Copyright (c) 2023, 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 'message_parser/message_parser.dart';
import 'message_with_metadata.dart';
class ArbParser {
final bool addName;
ArbParser([this.addName = false]);
MessageListWithMetadata parseMessageFile(Map<String, dynamic> arb) {
final locale = arb['@@locale'] as String?;
final context = arb['@@context'] as String?;
final templatePath = arb['@@x-template'] as String?;
final messages = arb.keys
.where((key) => !key.startsWith('@'))
.map((key) => parseMessage(arb, key, '${context}_$locale'))
.toList();
return MessageListWithMetadata(
messages,
locale,
context,
templatePath == null,
);
}
MessageWithMetadata parseMessage(
Map<String, dynamic> arb,
String messageKey,
String debugString,
) {
final messageContent = arb[messageKey] as String;
final message = MessageParser.parse(
debugString,
messageContent,
messageKey,
addName,
);
final messageMetadata = arb['@$messageKey'];
if (messageMetadata != null) {
final metadata = messageMetadata as Map<String, dynamic>;
final description = metadata['description'] as String?;
final placeholdersMap = metadata['placeholders'] as Map<String, dynamic>?;
final placeholders = placeholdersMap ?? <String, dynamic>{};
final placeholdersWithMetadata = parsePlaceholderMetadata(placeholders);
message.placeholders = message.placeholders
.map((placeholder) => placeholdersWithMetadata.firstWhere(
(p) => p.name == placeholder.name,
orElse: () => placeholder,
))
.toList();
message.description = description;
}
return message;
}
List<Placeholder> parsePlaceholderMetadata(
Map<String, dynamic> placeholders,
) {
final placeholderTypes = <Placeholder>[];
for (var entry in placeholders.entries) {
final placeholderName = entry.key;
final placeholderData = entry.value as Map<String, dynamic>;
final type = (placeholderData['type'] as String?) ?? 'String';
final example = placeholderData['example'] as String?;
placeholderTypes.add(Placeholder(
name: placeholderName,
type: type,
example: example,
));
}
return placeholderTypes;
}
}