writeField method

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

Implementation

void writeField(int fieldNumber, int fieldType, Object? fieldValue) {
  final valueType = PbFieldType._baseType(fieldType);

  if ((fieldType & PbFieldType._PACKED_BIT) != 0) {
    final list = fieldValue as List;
    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 map = fieldValue as PbMap;
    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(
          PbMap._keyFieldNumber, map.keyFieldType, key, keyWireFormat);
      _writeValue(PbMap._valueFieldNumber, map.valueFieldType, value,
          valueWireFormat);
      _endLengthDelimited(mark);
    });
    return;
  }

  final wireFormat = _wireTypes[_valueTypeIndex(valueType)];

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