decode method

  1. @override
DiffChange decode(
  1. Object? value
)
override

Decodes a JSON-compatible wire value.

Implementation

@override
DiffChange decode(Object? value) {
  final payload = decodeAcpObject(value);
  final tag = decodeAcpString(payload['operation']);
  switch (tag) {
    case 'add':
      final decoder = AcpResilientDecoder(payload);
      return DiffChangeAdd(
        diffPathChangeCodec.decode(payload),
        fileType: decoder
            .optionalOnError(
              'fileType',
              (value) => diffFileTypeCodec.decode(value),
            )
            .valueOrNull,
        mimeType: decoder
            .optionalOnError(
              'mimeType',
              (value) => mediaTypeCodec.decode(value),
            )
            .valueOrNull,
        meta: decoder.meta(),
      );
    case 'delete':
      final decoder = AcpResilientDecoder(payload);
      return DiffChangeDelete(
        diffPathChangeCodec.decode(payload),
        fileType: decoder
            .optionalOnError(
              'fileType',
              (value) => diffFileTypeCodec.decode(value),
            )
            .valueOrNull,
        mimeType: decoder
            .optionalOnError(
              'mimeType',
              (value) => mediaTypeCodec.decode(value),
            )
            .valueOrNull,
        meta: decoder.meta(),
      );
    case 'modify':
      final decoder = AcpResilientDecoder(payload);
      return DiffChangeModify(
        diffPathChangeCodec.decode(payload),
        fileType: decoder
            .optionalOnError(
              'fileType',
              (value) => diffFileTypeCodec.decode(value),
            )
            .valueOrNull,
        mimeType: decoder
            .optionalOnError(
              'mimeType',
              (value) => mediaTypeCodec.decode(value),
            )
            .valueOrNull,
        meta: decoder.meta(),
      );
    case 'move':
      final decoder = AcpResilientDecoder(payload);
      return DiffChangeMove(
        diffPathPairChangeCodec.decode(payload),
        fileType: decoder
            .optionalOnError(
              'fileType',
              (value) => diffFileTypeCodec.decode(value),
            )
            .valueOrNull,
        mimeType: decoder
            .optionalOnError(
              'mimeType',
              (value) => mediaTypeCodec.decode(value),
            )
            .valueOrNull,
        meta: decoder.meta(),
      );
    case 'copy':
      final decoder = AcpResilientDecoder(payload);
      return DiffChangeCopy(
        diffPathPairChangeCodec.decode(payload),
        fileType: decoder
            .optionalOnError(
              'fileType',
              (value) => diffFileTypeCodec.decode(value),
            )
            .valueOrNull,
        mimeType: decoder
            .optionalOnError(
              'mimeType',
              (value) => mediaTypeCodec.decode(value),
            )
            .valueOrNull,
        meta: decoder.meta(),
      );
    default:
      return DiffChangeCustom(
        discriminator: tag,
        payload: AcpJsonObject.fromObject(payload),
      );
  }
}