blob: 03d52f0fee00bbd32f4c2484dc7e54b926406ede [file] [log] [blame] [edit]
/**
* @fileoverview Public APIs exposed purely for use by generated code. Use of
* these APIs outside of that context is not supported and actively discouraged.
* @public
*
* DO NOT USE THIS OUTSIDE OF THIS PACKAGE.
*/
goog.module('jspb.internal.public_for_gencode');
goog.module.declareLegacyNamespace();
const asserts = goog.require('goog.asserts');
const { BinaryReader } = goog.require('jspb.binary.reader');
const { BinaryWriter } = goog.requireType('jspb.binary.writer');
const JspbMap = goog.requireType('jspb.Map');
/**
* Write this Map field in wire format to a BinaryWriter, using the given
* field number.
* @param {?JspbMap<K,V>} map
* @param {number} fieldNumber
* @param {!BinaryWriter} writer
* @param {function(this:BinaryWriter,number,K_OR_NULL)} keyWriterFn
* The method on BinaryWriter that writes type K to the stream.
* @param {function(this:BinaryWriter,number,V,?=)|
* function(this:BinaryWriter,number,V,?)} valueWriterFn
* The method on BinaryWriter that writes type V to the stream. May be
* writeMessage, in which case the second callback arg form is used.
* @param {function(V,!BinaryWriter)=} valueWriterCallback
* The BinaryWriter serialization callback for type V, if V is a message
* type.
* @template K,V
* Use go/closure-ttl to create a `K|null` type for the keyWriterFn argument
* closure type inference will occasionally infer K based on the keyWriterFn
* argument instead of the map argument which will cause type errors when they
* don't match
* @template K_OR_NULL := union(K, 'null') =:
*/
function serializeMapToBinary(
map, fieldNumber, writer, keyWriterFn, valueWriterFn, valueWriterCallback) {
if (!map) {
return;
}
map.forEach((value, key) => {
writer.writeMessage(
fieldNumber, /* we need a non-null value to pass here */ map,
(ignored, w) => {
keyWriterFn.call(w, 1, key);
valueWriterFn.call(w, 2, value, valueWriterCallback);
});
});
}
/**
* Read one key/value message from the given BinaryReader. Compatible as the
* `reader` callback parameter to BinaryReader.readMessage, to be called
* when a key/value pair submessage is encountered. If the Key is undefined,
* we should default it to 0.
* @template K, V
* @param {!JspbMap<K,V>} map
* @param {!BinaryReader} reader
* @param {function(this:BinaryReader):K} keyReaderFn
* The method on BinaryReader that reads type K from the stream.
*
* @param {K} defaultKey
* The default value for the type of map keys. Accepting map entries with
* unset keys is required for maps to be backwards compatible with the
* repeated message representation described here: goo.gl/zuoLAC
*
* @param {function(this:BinaryReader):V|function(V,!BinaryReader)}
* valueReaderFn
* The method on BinaryReader that reads type V from the stream, or a
* callback for readMessage.
*
* @param {V} defaultValue
* The default value for the type of map values. Accepting map entries with
* unset values is required for maps to be backwards compatible with the
* repeated message representation described here: goo.gl/zuoLAC
*/
function deserializeMapFromBinary(
map, reader, keyReaderFn, defaultKey, valueReaderFn, defaultValue) {
reader.readMessage(map, (message, reader) => {
let key = defaultKey;
let value = defaultValue;
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
const field = reader.getFieldNumber();
if (field == 1) {
// Key.
key = keyReaderFn.call(reader);
} else if (field == 2) {
// Value.
if (map.valueCtor) {
reader.readMessage(value, valueReaderFn);
} else {
value = (/** @type {function(this:BinaryReader):?} */ (valueReaderFn))
.call(reader);
}
}
}
asserts.assert(key != undefined);
asserts.assert(value != undefined);
map.set(key, value);
});
}
exports = {deserializeMapFromBinary, serializeMapToBinary};