JsonCollectionReader
using System.ClientModel.Internal;
using System.Collections;
using System.Runtime.CompilerServices;
using System.Text.Json;
namespace System.ClientModel.Primitives
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal class JsonCollectionReader : CollectionReader
{
internal override object Read(ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper, BinaryData data, ModelReaderWriterTypeBuilder builder, ModelReaderWriterContext context, ModelReaderWriterOptions options)
{
Utf8JsonReader reader = new Utf8JsonReader(BinaryData.op_Implicit(data), default(JsonReaderOptions));
reader.Read();
if (collectionWrapper.Builder is IDictionary) {
if (reader.TokenType != JsonTokenType.StartObject)
throw new FormatException("Expected start of dictionary.");
} else if (reader.TokenType != JsonTokenType.StartArray) {
throw new FormatException("Expected start of array.");
}
ReadJsonCollection(ref reader, collectionWrapper, builder, options, context);
return collectionWrapper.ToCollection();
}
private static void ReadJsonCollection(ref Utf8JsonReader reader, ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper, ModelReaderWriterTypeBuilder builder, ModelReaderWriterOptions options, ModelReaderWriterContext context)
{
object builder2 = collectionWrapper.Builder;
bool flag = false;
IJsonModel<object> jsonModel = null;
string key = null;
ModelReaderWriterTypeBuilder typeBuilder = context.GetTypeBuilder(builder.GetItemType());
object obj = typeBuilder.CreateObject();
ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper2 = obj as ModelReaderWriterTypeBuilder.CollectionWrapper;
if (collectionWrapper2 != null)
flag = (collectionWrapper2.Builder is IDictionary);
else {
IJsonModel<object> jsonModel2 = obj as IJsonModel<object>;
if (jsonModel2 == null) {
Type itemType = builder.GetItemType();
throw new InvalidOperationException("Item type '" + (((object)itemType != null) ? itemType.ToFriendlyName() : null) + "' must implement IJsonModel");
}
jsonModel = jsonModel2;
}
while (reader.Read()) {
switch (reader.TokenType) {
case JsonTokenType.EndObject:
return;
case JsonTokenType.EndArray:
return;
case JsonTokenType.StartObject:
if (flag) {
ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper4 = typeBuilder.CreateObject() as ModelReaderWriterTypeBuilder.CollectionWrapper;
ReadJsonCollection(ref reader, collectionWrapper4, typeBuilder, options, context);
collectionWrapper.AddItem(collectionWrapper4.ToCollection(), key);
} else {
if (jsonModel == null)
throw new FormatException("Unexpected JsonTokenType.StartObject found.");
collectionWrapper.AddItem(jsonModel.Create(ref reader, options), key);
}
break;
case JsonTokenType.StartArray: {
if (flag)
throw new FormatException("Unexpected JsonTokenType.StartArray found.");
ModelReaderWriterTypeBuilder.CollectionWrapper collectionWrapper3 = typeBuilder.CreateObject() as ModelReaderWriterTypeBuilder.CollectionWrapper;
if (collectionWrapper3 != null) {
ReadJsonCollection(ref reader, collectionWrapper3, typeBuilder, options, context);
collectionWrapper.AddItem(collectionWrapper3.ToCollection(), key);
} else
collectionWrapper.AddItem(jsonModel.Create(ref reader, options), key);
break;
}
case JsonTokenType.PropertyName:
key = reader.GetString();
break;
case JsonTokenType.Null:
collectionWrapper.AddItem(null, key);
break;
default:
throw new FormatException($"""{reader.TokenType}""");
}
}
}
}
}