writeField method

void writeField(
  1. int fieldNumber,
  2. int fieldType,
  3. dynamic fieldValue
)

Implementation

void writeField(int fieldNumber, int fieldType, dynamic fieldValue) {
  final valueType = PbFieldType.baseType(fieldType);

  if ((fieldType & PbFieldType.PACKED_BIT) != 0) {
    final List list = fieldValue;
    if (list.isNotEmpty) {
      _writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
      final mark = _startLengthDelimited();
      for (final value in list) {
        _writeValueAs(valueType, value);
      }
      _endLengthDelimited(mark);
    }
    return;
  }

  if ((fieldType & PbFieldType.MAP_BIT) != 0) {
    final PbMap map = fieldValue;
    final keyWireFormat = _wireTypes[_valueTypeIndex(map.keyFieldType)];
    final valueWireFormat = _wireTypes[_valueTypeIndex(map.valueFieldType)];

    map.forEach((key, value) {
      _writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
      final mark = _startLengthDelimited();
      _writeValue(mapKeyFieldNumber, map.keyFieldType, key, keyWireFormat);
      _writeValue(
        mapValueFieldNumber,
        map.valueFieldType,
        value,
        valueWireFormat,
      );
      _endLengthDelimited(mark);
    });
    return;
  }

  final wireFormat = _wireTypes[_valueTypeIndex(valueType)];

  if ((fieldType & PbFieldType.REPEATED_BIT) != 0) {
    final List list = fieldValue;
    for (var i = 0; i < list.length; i++) {
      _writeValue(fieldNumber, valueType, list[i], wireFormat);
    }
    return;
  }
  _writeValue(fieldNumber, valueType, fieldValue, wireFormat);
}