writeGeneralCodec method

  1. @override
void writeGeneralCodec(
  1. ObjcOptions generatorOptions,
  2. Root root,
  3. Indent indent, {
  4. 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;');
  });
}