blob: 7890bea2d5b35108d6d19a32cdc75176c0327247 [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 'plural_selector.dart';
sealed class Message {
final String? id;
Message(this.id);
String generateString(
List allArgs, {
required PluralSelector pluralSelector,
String? locale,
String Function(String p1)? cleaner,
});
}
final class CombinedMessage extends Message {
final List<Message> messages;
CombinedMessage(super.id, this.messages);
@override
String generateString(
List allArgs, {
required PluralSelector pluralSelector,
String Function(String p1)? cleaner,
String? locale,
}) =>
messages
.map((e) => e.generateString(
allArgs,
pluralSelector: pluralSelector,
cleaner: cleaner,
locale: locale,
))
.join();
static const int type = 6;
}
final class StringMessage extends Message {
final String value;
/// Maps argument indices to their position in the string, where they are to
/// be inserted.
///
/// This list is expected to be sorted by `argPositions.stringIndex`
final List<({int stringIndex, int argIndex})> argPositions;
StringMessage(this.value, {this.argPositions = const [], String? id})
: super(id);
static const int type = 1;
@override
String generateString(
List allArgs, {
required PluralSelector pluralSelector,
String Function(String p1)? cleaner,
String? locale,
}) {
final s = cleaner?.call(value) ?? value;
if (argPositions.isNotEmpty) {
final sb = StringBuffer(value.substring(0, argPositions[0].stringIndex));
for (var i = 0; i < argPositions.length; i++) {
final position = argPositions[i];
sb.write(allArgs[position.argIndex]);
sb.write(value.substring(
position.stringIndex,
i + 1 < argPositions.length
? argPositions[i + 1].stringIndex
: s.length,
));
}
return sb.toString();
} else {
return s;
}
}
}
final class PluralMessage extends Message {
final Map<int, Message> numberCases;
final Map<int, Message> wordCases;
final Message? few;
final Message? many;
final Message other;
final int argIndex;
PluralMessage({
this.numberCases = const {},
this.wordCases = const {},
this.few,
this.many,
required this.other,
required this.argIndex,
String? id,
}) : super(id);
static const int type = 3;
@override
String generateString(
List allArgs, {
required PluralSelector pluralSelector,
String Function(String p1)? cleaner,
String? locale,
}) {
return pluralSelector(
allArgs[argIndex] as num,
locale!,
numberCases: numberCases,
wordCases: wordCases,
few: few,
many: many,
other: other,
).generateString(allArgs,
pluralSelector: pluralSelector, cleaner: cleaner, locale: locale);
}
}
final class SelectMessage extends Message {
final Message other;
final Map<String, Message> cases;
final int argIndex;
SelectMessage(
this.other,
this.cases,
this.argIndex, [
super.id,
]);
static const int type = 4;
@override
String generateString(
List allArgs, {
required PluralSelector pluralSelector,
String Function(String p1)? cleaner,
String? locale,
}) {
final selected = cases[allArgs[argIndex]!] ?? other;
return selected.generateString(
pluralSelector: pluralSelector,
allArgs,
cleaner: cleaner,
locale: locale,
);
}
}