generate method
Implementation
void generate(IndentingWriter out) {
final comment = fileGen?.commentBlock(fieldPath!);
if (comment != null) {
out.println(comment);
}
out.addAnnotatedBlock(
'enum $classname implements $protobufImportPrefix.ProtobufEnum {',
'}\n', [
NamedLocation(
name: classname!, fieldPathSegment: fieldPath!, start: 'enum '.length)
], () {
final bool betterProtos = fileGen!.useBetterProtos;
// -----------------------------------------------------------------
// Define enum types.
for (var i = 0; i < _canonicalValues.length; i++) {
final val = _canonicalValues[i];
final name = dartNames[val.name]!;
final omitEnumNames = ConditionalConstDefinition('omit_enum_names');
out.addSuffix(
omitEnumNames.constFieldName, omitEnumNames.constDefinition);
final conditionalValName = omitEnumNames.createTernary(val.name);
final separator = i < _canonicalValues.length - 1 ? ',' : ';';
out.printlnAnnotated(
'$name(${val.number}, \'$name\', $conditionalValName)$separator', [
NamedLocation(
name: name,
fieldPathSegment: List.from(fieldPath!)
..addAll([_enumValueTag, _originalCanonicalIndices[i]]),
start: 0)
]);
}
if (_aliases.isNotEmpty) {
out.println();
for (var i = 0; i < _aliases.length; i++) {
final alias = _aliases[i];
final name = dartNames[alias.value.name]!;
out.printlnAnnotated(
'static const $classname $name ='
' ${dartNames[alias.canonicalValue.name]};',
[
NamedLocation(
name: name,
fieldPathSegment: List.from(fieldPath!)
..addAll([_enumValueTag, _originalAliasIndices[i]]),
start: 'static const $classname '.length)
]);
}
}
out.println();
out.println('$overridePrefix final $coreImportPrefix.int value;');
out.println();
/// We must always override `name` because ProtobufEnum unfortunately requires it.
out.println('$overridePrefix final $coreImportPrefix.String name;');
out.println();
out.println(
'final $coreImportPrefix.String ${betterProtos ? 'protoName' : 'dartName'};');
out.println();
if (!betterProtos) {
out.println('''
/// protobuf.dart 3 spec:
/// https://pub.dev/documentation/protobuf/latest/protobuf/ProtobufEnum/toString.html
/// Returns this enum's [name] or the [value] if names are not represented.
@\$core.override
\$core.String toString() => name == '' ? value.toString() : name;
''');
}
out.println(
'static final $coreImportPrefix.Map<$coreImportPrefix.int, $classname> _byValue ='
' $protobufImportPrefix.ProtobufEnum.initByValue(values);');
out.println('static $classname? valueOf($coreImportPrefix.int value) =>'
' _byValue[value];');
out.println();
out.println(
'static final $coreImportPrefix.Map<$coreImportPrefix.String, $classname> _byProtoName ='
' { for (final value in values) value.${betterProtos ? 'protoName' : 'name'}: value };');
out.println(
'static final $coreImportPrefix.Map<$coreImportPrefix.String, $classname> _byDartName ='
' values.asNameMap();');
final unspecifiedRegexp = RegExp(r'(unspecified|unknown|undefined)$',
caseSensitive: false, multiLine: true);
final unspecifiedValue = dartNames.values
.firstWhereOrNull((name) => unspecifiedRegexp.hasMatch(name));
final bool hasUnspecified = unspecifiedValue != null;
final String orUnspecified =
hasUnspecified ? ' ?? $unspecifiedValue' : '';
out.println(
'static $classname${hasUnspecified ? '' : '?'} ofProtoName($coreImportPrefix.String name) =>'
' _byProtoName[name]$orUnspecified;');
out.println(
'static $classname${hasUnspecified ? '' : '?'} ofDartName($coreImportPrefix.String name) =>'
' _byDartName[name]$orUnspecified;');
out.println();
if (betterProtos) {
out.println('const $classname(this.value, this.name, this.protoName);');
} else {
out.println('const $classname(this.value, this.dartName, this.name);');
}
});
}