/// <summary> /// Resets the bulk response for re-use. /// </summary> public void Reset() { mTookProxy = default; mErrorsProxy = default; if (Items != null) { mPool.Return(Items); Items = null; } }
/// <summary> /// Reads the response from specified UTF-8 JSON document and initializes the specified response. /// Called by <see cref="BulkResponsePool"/> to initialize the response. /// </summary> /// <param name="data">JSON document to read.</param> /// <returns> /// The created response. /// Call <see cref="ReturnToPool"/> to release it when you're done. /// </returns> internal void InitFromJson(byte[] data) { var reader = new Utf8JsonReader(data, sJsonReaderOptions); string propertyName = null; // skip the first curly brace that starts all json documents reader.Read(); Debug.Assert(reader.TokenType == JsonTokenType.StartObject); while (reader.Read()) { switch (reader.TokenType) { case JsonTokenType.PropertyName: { propertyName = mPool.GetStringFromUtf8(reader.ValueSpan); break; } case JsonTokenType.True: case JsonTokenType.False: { switch (propertyName) { case "errors": mErrorsProxy = new BooleanPropertyProxy(data, (int)reader.TokenStartIndex, reader.ValueSpan.Length); break; } break; } case JsonTokenType.Number: { switch (propertyName) { case "took": mTookProxy = new Int32PropertyProxy(data, (int)reader.TokenStartIndex, reader.ValueSpan.Length); break; } break; } case JsonTokenType.StartArray: { switch (propertyName) { case "items": Items = DeserializeItems(data, ref reader); break; default: // unexpected property, skip all children! reader.Skip(); break; } break; } case JsonTokenType.EndObject: { return; } default: { // unexpected token, skip! reader.Skip(); break; } } } throw new ArgumentException("The reader did not deliver a closing 'EndObject'."); }