writeGeneralCodec method
void
writeGeneralCodec(
- ObjcOptions generatorOptions,
- Root root,
- Indent indent, {
- required String dartPackageName,
override
Writes the custom codec to indent
.
Implementation
@override
void writeGeneralCodec(
ObjcOptions generatorOptions,
Root root,
Indent indent, {
required String dartPackageName,
}) {
const String codecName = 'PigeonCodec';
final Iterable<EnumeratedType> codecClasses = getEnumeratedTypes(root);
final String readerWriterName =
'${generatorOptions.prefix}${toUpperCamelCase(generatorOptions.fileSpecificClassNameComponent ?? '')}${codecName}ReaderWriter';
final String readerName =
'${generatorOptions.prefix}${toUpperCamelCase(generatorOptions.fileSpecificClassNameComponent ?? '')}${codecName}Reader';
final String writerName =
'${generatorOptions.prefix}${toUpperCamelCase(generatorOptions.fileSpecificClassNameComponent ?? '')}${codecName}Writer';
indent.writeln('@interface $readerName : FlutterStandardReader');
indent.writeln('@end');
indent.writeln('@implementation $readerName');
indent.write('- (nullable id)readValueOfType:(UInt8)type ');
indent.addScoped('{', '}', () {
indent.write('switch (type) ');
indent.addScoped('{', '}', () {
for (final EnumeratedType customType in codecClasses) {
indent.writeln('case ${customType.enumeration}: ');
indent.nest(1, () {
if (customType.type == CustomTypes.customClass) {
indent.writeln(
'return [${_className(generatorOptions.prefix, customType.name)} fromList:[self readValue]];');
} else if (customType.type == CustomTypes.customEnum) {
indent.writeScoped('{', '}', () {
indent.writeln('NSNumber *enumAsNumber = [self readValue];');
indent.writeln(
'return enumAsNumber == nil ? nil : [[${_enumName(customType.name, prefix: generatorOptions.prefix, box: true)} alloc] initWithValue:[enumAsNumber integerValue]];');
});
}
});
}
indent.writeln('default:');
indent.nest(1, () {
indent.writeln('return [super readValueOfType:type];');
});
});
});
indent.writeln('@end');
indent.newln();
indent.writeln('@interface $writerName : FlutterStandardWriter');
indent.writeln('@end');
indent.writeln('@implementation $writerName');
indent.write('- (void)writeValue:(id)value ');
indent.addScoped('{', '}', () {
bool firstClass = true;
for (final EnumeratedType customClass in codecClasses) {
if (firstClass) {
indent.write('');
firstClass = false;
}
if (customClass.type == CustomTypes.customClass) {
indent.add(
'if ([value isKindOfClass:[${_className(generatorOptions.prefix, customClass.name)} class]]) ');
indent.addScoped('{', '} else ', () {
indent.writeln('[self writeByte:${customClass.enumeration}];');
indent.writeln('[self writeValue:[value toList]];');
}, addTrailingNewline: false);
} else if (customClass.type == CustomTypes.customEnum) {
final String boxName = _enumName(customClass.name,
prefix: generatorOptions.prefix, box: true);
indent.add('if ([value isKindOfClass:[$boxName class]]) ');
indent.addScoped('{', '} else ', () {
indent.writeln('$boxName * box = ($boxName *)value;');
indent.writeln('[self writeByte:${customClass.enumeration}];');
indent.writeln(
'[self writeValue:(value == nil ? [NSNull null] : [NSNumber numberWithInteger:box.value])];');
}, addTrailingNewline: false);
}
}
indent.addScoped('{', '}', () {
indent.writeln('[super writeValue:value];');
});
});
indent.writeln('@end');
indent.newln();
indent.format('''
@interface $readerWriterName : FlutterStandardReaderWriter
@end
@implementation $readerWriterName
- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data {
\treturn [[$writerName alloc] initWithData:data];
}
- (FlutterStandardReader *)readerWithData:(NSData *)data {
\treturn [[$readerName alloc] initWithData:data];
}
@end''');
indent.newln();
indent.write(
'NSObject<FlutterMessageCodec> *${generatorOptions.prefix}Get${toUpperCamelCase(generatorOptions.fileSpecificClassNameComponent ?? '')}Codec(void) ');
indent.addScoped('{', '}', () {
indent
.writeln('static FlutterStandardMessageCodec *sSharedObject = nil;');
indent.writeln('static dispatch_once_t sPred = 0;');
indent.write('dispatch_once(&sPred, ^');
indent.addScoped('{', '});', () {
indent.writeln(
'$readerWriterName *readerWriter = [[$readerWriterName alloc] init];');
indent.writeln(
'sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter];');
});
indent.writeln('return sSharedObject;');
});
}