blob: df26babb662f545d08efa5e58d451f7f05b83012 [file] [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 'intl_object.dart';
sealed class Message {
final String? id;
Message(this.id);
String generateString(
List allArgs, {
required IntlObject intl,
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 IntlObject intl,
String Function(String p1)? cleaner,
String? locale,
}) =>
messages
.map((e) => e.generateString(
allArgs,
intl: intl,
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 [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 IntlObject intl,
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 GenderMessage extends Message {
final Message? male;
final Message? female;
final Message other;
final int argIndex;
GenderMessage({
this.male,
this.female,
required this.other,
required this.argIndex,
String? id,
}) : super(id);
static const int type = 5;
@override
String generateString(
List allArgs, {
required IntlObject intl,
String Function(String p1)? cleaner,
String? locale,
}) {
return intl
.gender(
allArgs[argIndex] as Gender,
female,
male,
other,
)
.generateString(
allArgs,
intl: intl,
cleaner: cleaner,
locale: locale,
);
}
}
enum Gender {
female,
male,
other;
}
final class PluralMessage extends Message {
final Message? zeroWord;
final Message? zeroNumber;
final Message? oneWord;
final Message? oneNumber;
final Message? twoWord;
final Message? twoNumber;
final Message? few;
final Message? many;
final Message other;
final int argIndex;
PluralMessage({
this.few,
this.many,
required this.other,
this.zeroWord,
this.zeroNumber,
this.oneWord,
this.oneNumber,
this.twoWord,
this.twoNumber,
required this.argIndex,
String? id,
}) : super(id);
static const int type = 3;
@override
String generateString(
List allArgs, {
required IntlObject intl,
String Function(String p1)? cleaner,
String? locale,
}) {
return intl
.plural(
allArgs[argIndex] as num,
few: few,
many: many,
zero: zeroNumber ?? zeroWord,
one: oneNumber ?? oneWord,
two: twoNumber ?? twoWord,
other: other,
locale: locale,
)
.generateString(allArgs, intl: intl, 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 IntlObject intl,
String Function(String p1)? cleaner,
String? locale,
}) {
final selected =
intl.select(allArgs[argIndex] as Object, {...cases, 'other': other});
return selected.generateString(
intl: intl,
allArgs,
cleaner: cleaner,
locale: locale,
);
}
}