in src/AutoRest.CSharp/Common/Input/InputTypes/Serialization/TypeSpecInputModelTypeConverter.cs [21:108]
public override InputModelType? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> ReadModelType(ref reader, options, _referenceHandler.CurrentResolver);
public override void Write(Utf8JsonWriter writer, InputModelType value, JsonSerializerOptions options)
=> throw new NotSupportedException("Writing not supported");
private static InputModelType? ReadModelType(ref Utf8JsonReader reader, JsonSerializerOptions options, ReferenceResolver resolver)
=> reader.ReadReferenceAndResolve<InputModelType>(resolver) ?? CreateModelType(ref reader, null, null, options, resolver);
public static InputModelType CreateModelType(ref Utf8JsonReader reader, string? id, string? name, JsonSerializerOptions options, ReferenceResolver resolver)
{
var isFirstProperty = id == null && name == null;
var properties = new List<InputModelProperty>();
var discriminatedSubtypes = new Dictionary<string, InputModelType>();
string? crossLanguageDefinitionId = null;
string? access = null;
string? deprecation = null;
string? summary = null;
string? doc = null;
string? usageString = null;
InputModelProperty? discriminatorProperty = null;
string? discriminatorValue = null;
InputType? additionalProperties = null;
InputModelType? baseModel = null;
InputModelType? model = null;
IReadOnlyList<InputDecoratorInfo>? decorators = null;
while (reader.TokenType != JsonTokenType.EndObject)
{
var isKnownProperty = reader.TryReadReferenceId(ref isFirstProperty, ref id)
|| reader.TryReadString("name", ref name)
|| reader.TryReadString("crossLanguageDefinitionId", ref crossLanguageDefinitionId)
|| reader.TryReadString("access", ref access)
|| reader.TryReadString("deprecation", ref deprecation)
|| reader.TryReadString("summary", ref summary)
|| reader.TryReadString("doc", ref doc)
|| reader.TryReadString("usage", ref usageString)
|| reader.TryReadComplexType("discriminatorProperty", options, ref discriminatorProperty)
|| reader.TryReadString("discriminatorValue", ref discriminatorValue)
|| reader.TryReadComplexType("additionalProperties", options, ref additionalProperties)
|| reader.TryReadComplexType("decorators", options, ref decorators);
if (isKnownProperty)
{
continue;
}
/**
* If the model has base model, `BaseModel` and `Properties` should be the last two items in tspCodeModel.
* and `BaseModel` should be last but one, and `Properties` should be the last one.
*/
if (reader.GetString() == "baseModel")
{
model = CreateInputModelTypeInstance(id, name, crossLanguageDefinitionId, access, deprecation, summary, doc, usageString, discriminatorValue, discriminatorProperty, baseModel, properties, discriminatedSubtypes, additionalProperties, decorators, resolver);
reader.TryReadComplexType("baseModel", options, ref baseModel);
if (baseModel != null)
{
model.SetBaseModel(baseModel);
var baseModelDerived = (List<InputModelType>)resolver.ResolveReference($"{baseModel.Name}.{nameof(InputModelType.DerivedModels)}");
baseModelDerived.Add(model);
}
continue;
}
if (reader.GetString() == "properties")
{
model = model ?? CreateInputModelTypeInstance(id, name, crossLanguageDefinitionId, access, deprecation, summary, doc, usageString, discriminatorValue, discriminatorProperty, baseModel, properties, discriminatedSubtypes, additionalProperties, decorators, resolver);
reader.Read();
CreateProperties(ref reader, properties, options, name!, model.Usage.HasFlag(InputModelTypeUsage.MultipartFormData));
continue;
}
if (reader.GetString() == "discriminatedSubtypes")
{
model = model ?? CreateInputModelTypeInstance(id, name, crossLanguageDefinitionId, access, deprecation, summary, doc, usageString, discriminatorValue, discriminatorProperty, baseModel, properties, discriminatedSubtypes, additionalProperties, decorators, resolver);
reader.Read();
CreateDiscriminatedSubtypes(ref reader, discriminatedSubtypes, options);
if (reader.TokenType != JsonTokenType.EndObject)
{
throw new JsonException($"{nameof(InputModelType)}.{nameof(InputModelType.Properties)} must be the last defined property for id '{id}', name '{name}'");
}
continue;
}
reader.SkipProperty();
}
var result = model ?? CreateInputModelTypeInstance(id, name, crossLanguageDefinitionId, access, deprecation,summary, doc, usageString, discriminatorValue, discriminatorProperty, baseModel, properties, discriminatedSubtypes, additionalProperties, decorators, resolver);
result.Decorators = decorators ?? Array.Empty<InputDecoratorInfo>();
return result;
}