Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
// <auto-generated/>

#nullable disable

using System;
using System.ClientModel.Primitives;
using System.Text.Json;

namespace SampleTypeSpec
{
/// <summary>
/// Base plant with discriminator
/// Please note this is the abstract base class. The derived classes available for instantiation are: <see cref="Tree"/>.
/// </summary>
[PersistableModelProxy(typeof(UnknownPlant))]
public abstract partial class Plant : IJsonModel<Plant>
{
/// <summary> Initializes a new instance of <see cref="Plant"/> for deserialization. </summary>
internal Plant()
{
}

/// <param name="writer"> The JSON writer. </param>
/// <param name="options"> The client options for reading and writing models. </param>
void IJsonModel<Plant>.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options)
{
writer.WriteStartObject();
JsonModelWriteCore(writer, options);
writer.WriteEndObject();
}

/// <param name="writer"> The JSON writer. </param>
/// <param name="options"> The client options for reading and writing models. </param>
protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
{
string format = options.Format == "W" ? ((IPersistableModel<Plant>)this).GetFormatFromOptions(options) : options.Format;
if (format != "J")
{
throw new FormatException($"The model {nameof(Plant)} does not support writing '{format}' format.");
}
writer.WritePropertyName("species"u8);
writer.WriteStringValue(Species);
writer.WritePropertyName("id"u8);
writer.WriteStringValue(Id);
writer.WritePropertyName("height"u8);
writer.WriteNumberValue(Height);
if (options.Format != "W" && _additionalBinaryDataProperties != null)
{
foreach (var item in _additionalBinaryDataProperties)
{
writer.WritePropertyName(item.Key);
#if NET6_0_OR_GREATER
writer.WriteRawValue(item.Value);
#else
using (JsonDocument document = JsonDocument.Parse(item.Value))
{
JsonSerializer.Serialize(writer, document.RootElement);
}
#endif
}
}
}

/// <param name="reader"> The JSON reader. </param>
/// <param name="options"> The client options for reading and writing models. </param>
Plant IJsonModel<Plant>.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options);

/// <param name="reader"> The JSON reader. </param>
/// <param name="options"> The client options for reading and writing models. </param>
protected virtual Plant JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options)
{
string format = options.Format == "W" ? ((IPersistableModel<Plant>)this).GetFormatFromOptions(options) : options.Format;
if (format != "J")
{
throw new FormatException($"The model {nameof(Plant)} does not support reading '{format}' format.");
}
using JsonDocument document = JsonDocument.ParseValue(ref reader);
return DeserializePlant(document.RootElement, options);
}

/// <param name="element"> The JSON element to deserialize. </param>
/// <param name="options"> The client options for reading and writing models. </param>
internal static Plant DeserializePlant(JsonElement element, ModelReaderWriterOptions options)
{
if (element.ValueKind == JsonValueKind.Null)
{
return null;
}
if (element.TryGetProperty("species"u8, out JsonElement discriminator))
{
switch (discriminator.GetString())
{
case "tree":
return Tree.DeserializeTree(element, options);
}
}
return UnknownPlant.DeserializeUnknownPlant(element, options);
}

/// <param name="options"> The client options for reading and writing models. </param>
BinaryData IPersistableModel<Plant>.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options);

/// <param name="options"> The client options for reading and writing models. </param>
protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options)
{
string format = options.Format == "W" ? ((IPersistableModel<Plant>)this).GetFormatFromOptions(options) : options.Format;
switch (format)
{
case "J":
return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default);
default:
throw new FormatException($"The model {nameof(Plant)} does not support writing '{options.Format}' format.");
}
}

/// <param name="data"> The data to parse. </param>
/// <param name="options"> The client options for reading and writing models. </param>
Plant IPersistableModel<Plant>.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options);

/// <param name="data"> The data to parse. </param>
/// <param name="options"> The client options for reading and writing models. </param>
protected virtual Plant PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options)
{
string format = options.Format == "W" ? ((IPersistableModel<Plant>)this).GetFormatFromOptions(options) : options.Format;
switch (format)
{
case "J":
using (JsonDocument document = JsonDocument.Parse(data))
{
return DeserializePlant(document.RootElement, options);
}
default:
throw new FormatException($"The model {nameof(Plant)} does not support reading '{options.Format}' format.");
}
}

/// <param name="options"> The client options for reading and writing models. </param>
string IPersistableModel<Plant>.GetFormatFromOptions(ModelReaderWriterOptions options) => "J";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// <auto-generated/>

#nullable disable

using System;
using System.Collections.Generic;

namespace SampleTypeSpec
{
/// <summary>
/// Base plant with discriminator
/// Please note this is the abstract base class. The derived classes available for instantiation are: <see cref="Tree"/>.
/// </summary>
public abstract partial class Plant
{
/// <summary> Keeps track of any properties unknown to the library. </summary>
private protected readonly IDictionary<string, BinaryData> _additionalBinaryDataProperties;

/// <summary> Initializes a new instance of <see cref="Plant"/>. </summary>
/// <param name="species"> The species of plant. </param>
/// <param name="id"> The unique identifier of the plant. </param>
/// <param name="height"> The height of the plant in centimeters. </param>
private protected Plant(string species, string id, int height)
{
Species = species;
Id = id;
Height = height;
}

/// <summary> Initializes a new instance of <see cref="Plant"/>. </summary>
/// <param name="species"> The species of plant. </param>
/// <param name="id"> The unique identifier of the plant. </param>
/// <param name="height"> The height of the plant in centimeters. </param>
/// <param name="additionalBinaryDataProperties"> Keeps track of any properties unknown to the library. </param>
internal Plant(string species, string id, int height, IDictionary<string, BinaryData> additionalBinaryDataProperties)
{
Species = species;
Id = id;
Height = height;
_additionalBinaryDataProperties = additionalBinaryDataProperties;
}

/// <summary> The species of plant. </summary>
internal string Species { get; set; }

/// <summary> The unique identifier of the plant. </summary>
public string Id { get; }

/// <summary> The height of the plant in centimeters. </summary>
public int Height { get; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,18 @@ namespace SampleTypeSpec
[ModelReaderWriterBuildable(typeof(ModelWithRequiredNullableProperties))]
[ModelReaderWriterBuildable(typeof(PageThing))]
[ModelReaderWriterBuildable(typeof(Pet))]
[ModelReaderWriterBuildable(typeof(Plant))]
[ModelReaderWriterBuildable(typeof(RenamedModel))]
[ModelReaderWriterBuildable(typeof(ReturnsAnonymousModelResponse))]
[ModelReaderWriterBuildable(typeof(RoundTripModel))]
[ModelReaderWriterBuildable(typeof(Thing))]
[ModelReaderWriterBuildable(typeof(Tree))]
[ModelReaderWriterBuildable(typeof(UnknownAnimal))]
[ModelReaderWriterBuildable(typeof(UnknownPet))]
[ModelReaderWriterBuildable(typeof(UnknownPlant))]
[ModelReaderWriterBuildable(typeof(XmlAdvancedModel))]
[ModelReaderWriterBuildable(typeof(XmlItem))]
[ModelReaderWriterBuildable(typeof(XmlNestedModel))]
public partial class SampleTypeSpecContext : ModelReaderWriterContext
{
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
// <auto-generated/>

#nullable disable

using System;
using System.ClientModel;
using System.ClientModel.Primitives;
using System.Collections.Generic;
using System.Text.Json;

namespace SampleTypeSpec
{
/// <summary> Tree is a specific type of plant. </summary>
public partial class Tree : Plant, IJsonModel<Tree>
{
/// <summary> Initializes a new instance of <see cref="Tree"/> for deserialization. </summary>
internal Tree()
{
}

/// <param name="writer"> The JSON writer. </param>
/// <param name="options"> The client options for reading and writing models. </param>
void IJsonModel<Tree>.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options)
{
writer.WriteStartObject();
JsonModelWriteCore(writer, options);
writer.WriteEndObject();
}

/// <param name="writer"> The JSON writer. </param>
/// <param name="options"> The client options for reading and writing models. </param>
protected override void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options)
{
string format = options.Format == "W" ? ((IPersistableModel<Tree>)this).GetFormatFromOptions(options) : options.Format;
if (format != "J")
{
throw new FormatException($"The model {nameof(Tree)} does not support writing '{format}' format.");
}
base.JsonModelWriteCore(writer, options);
writer.WritePropertyName("age"u8);
writer.WriteNumberValue(Age);
}

/// <param name="reader"> The JSON reader. </param>
/// <param name="options"> The client options for reading and writing models. </param>
Tree IJsonModel<Tree>.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => (Tree)JsonModelCreateCore(ref reader, options);

/// <param name="reader"> The JSON reader. </param>
/// <param name="options"> The client options for reading and writing models. </param>
protected override Plant JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options)
{
string format = options.Format == "W" ? ((IPersistableModel<Tree>)this).GetFormatFromOptions(options) : options.Format;
if (format != "J")
{
throw new FormatException($"The model {nameof(Tree)} does not support reading '{format}' format.");
}
using JsonDocument document = JsonDocument.ParseValue(ref reader);
return DeserializeTree(document.RootElement, options);
}

/// <param name="element"> The JSON element to deserialize. </param>
/// <param name="options"> The client options for reading and writing models. </param>
internal static Tree DeserializeTree(JsonElement element, ModelReaderWriterOptions options)
{
if (element.ValueKind == JsonValueKind.Null)
{
return null;
}
string species = "tree";
string id = default;
int height = default;
IDictionary<string, BinaryData> additionalBinaryDataProperties = new ChangeTrackingDictionary<string, BinaryData>();
int age = default;
foreach (var prop in element.EnumerateObject())
{
if (prop.NameEquals("species"u8))
{
species = prop.Value.GetString();
continue;
}
if (prop.NameEquals("id"u8))
{
id = prop.Value.GetString();
continue;
}
if (prop.NameEquals("height"u8))
{
height = prop.Value.GetInt32();
continue;
}
if (prop.NameEquals("age"u8))
{
age = prop.Value.GetInt32();
continue;
}
if (options.Format != "W")
{
additionalBinaryDataProperties.Add(prop.Name, BinaryData.FromString(prop.Value.GetRawText()));
}
}
return new Tree(species, id, height, additionalBinaryDataProperties, age);
}

/// <param name="options"> The client options for reading and writing models. </param>
BinaryData IPersistableModel<Tree>.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options);

/// <param name="options"> The client options for reading and writing models. </param>
protected override BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options)
{
string format = options.Format == "W" ? ((IPersistableModel<Tree>)this).GetFormatFromOptions(options) : options.Format;
switch (format)
{
case "J":
return ModelReaderWriter.Write(this, options, SampleTypeSpecContext.Default);
default:
throw new FormatException($"The model {nameof(Tree)} does not support writing '{options.Format}' format.");
}
}

/// <param name="data"> The data to parse. </param>
/// <param name="options"> The client options for reading and writing models. </param>
Tree IPersistableModel<Tree>.Create(BinaryData data, ModelReaderWriterOptions options) => (Tree)PersistableModelCreateCore(data, options);

/// <param name="data"> The data to parse. </param>
/// <param name="options"> The client options for reading and writing models. </param>
protected override Plant PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options)
{
string format = options.Format == "W" ? ((IPersistableModel<Tree>)this).GetFormatFromOptions(options) : options.Format;
switch (format)
{
case "J":
using (JsonDocument document = JsonDocument.Parse(data))
{
return DeserializeTree(document.RootElement, options);
}
default:
throw new FormatException($"The model {nameof(Tree)} does not support reading '{options.Format}' format.");
}
}

/// <param name="options"> The client options for reading and writing models. </param>
string IPersistableModel<Tree>.GetFormatFromOptions(ModelReaderWriterOptions options) => "J";

/// <param name="result"> The <see cref="ClientResult"/> to deserialize the <see cref="Tree"/> from. </param>
public static explicit operator Tree(ClientResult result)
{
using PipelineResponse response = result.GetRawResponse();
using JsonDocument document = JsonDocument.Parse(response.Content);
return DeserializeTree(document.RootElement, ModelSerializationExtensions.WireOptions);
}
}
}
Loading
Loading