// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // #nullable disable using System; using System.ClientModel.Primitives; using System.Collections.Generic; using System.Text.Json; using Azure.Core; namespace Azure.Analytics.Purview.DataMap { /// Business metadata to send to the service. public partial class BusinessMetadataOptions : IJsonModel { /// Initializes a new instance of for deserialization. internal BusinessMetadataOptions() { } /// The data to parse. /// The client options for reading and writing models. protected virtual BusinessMetadataOptions PersistableModelCreateCore(BinaryData data, ModelReaderWriterOptions options) { string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": using (JsonDocument document = JsonDocument.Parse(data, ModelSerializationExtensions.JsonDocumentOptions)) { return DeserializeBusinessMetadataOptions(document.RootElement, options); } default: throw new FormatException($"The model {nameof(BusinessMetadataOptions)} does not support reading '{options.Format}' format."); } } /// The client options for reading and writing models. protected virtual BinaryData PersistableModelWriteCore(ModelReaderWriterOptions options) { string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": return ModelReaderWriter.Write(this, options, AzureAnalyticsPurviewDataMapContext.Default); default: throw new FormatException($"The model {nameof(BusinessMetadataOptions)} does not support writing '{options.Format}' format."); } } /// The client options for reading and writing models. BinaryData IPersistableModel.Write(ModelReaderWriterOptions options) => PersistableModelWriteCore(options); /// The data to parse. /// The client options for reading and writing models. BusinessMetadataOptions IPersistableModel.Create(BinaryData data, ModelReaderWriterOptions options) => PersistableModelCreateCore(data, options); /// The client options for reading and writing models. string IPersistableModel.GetFormatFromOptions(ModelReaderWriterOptions options) => "J"; /// The to serialize into . public static implicit operator RequestContent(BusinessMetadataOptions businessMetadataOptions) { if (businessMetadataOptions == null) { return null; } return RequestContent.Create(businessMetadataOptions, ModelSerializationExtensions.WireOptions); } /// The JSON writer. /// The client options for reading and writing models. void IJsonModel.Write(Utf8JsonWriter writer, ModelReaderWriterOptions options) { writer.WriteStartObject(); JsonModelWriteCore(writer, options); writer.WriteEndObject(); } /// The JSON writer. /// The client options for reading and writing models. protected virtual void JsonModelWriteCore(Utf8JsonWriter writer, ModelReaderWriterOptions options) { string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { throw new FormatException($"The model {nameof(BusinessMetadataOptions)} does not support writing '{format}' format."); } writer.WritePropertyName("file"u8); #if NET6_0_OR_GREATER writer.WriteRawValue(File); #else using (JsonDocument document = JsonDocument.Parse(File)) { JsonSerializer.Serialize(writer, document.RootElement); } #endif 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 } } } /// The JSON reader. /// The client options for reading and writing models. BusinessMetadataOptions IJsonModel.Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options) => JsonModelCreateCore(ref reader, options); /// The JSON reader. /// The client options for reading and writing models. protected virtual BusinessMetadataOptions JsonModelCreateCore(ref Utf8JsonReader reader, ModelReaderWriterOptions options) { string format = options.Format == "W" ? ((IPersistableModel)this).GetFormatFromOptions(options) : options.Format; if (format != "J") { throw new FormatException($"The model {nameof(BusinessMetadataOptions)} does not support reading '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); return DeserializeBusinessMetadataOptions(document.RootElement, options); } /// The JSON element to deserialize. /// The client options for reading and writing models. internal static BusinessMetadataOptions DeserializeBusinessMetadataOptions(JsonElement element, ModelReaderWriterOptions options) { if (element.ValueKind == JsonValueKind.Null) { return null; } BinaryData @file = default; IDictionary additionalBinaryDataProperties = new ChangeTrackingDictionary(); foreach (var prop in element.EnumerateObject()) { if (prop.NameEquals("file"u8)) { @file = BinaryData.FromString(prop.Value.GetRawText()); continue; } if (options.Format != "W") { additionalBinaryDataProperties.Add(prop.Name, BinaryData.FromString(prop.Value.GetRawText())); } } return new BusinessMetadataOptions(@file, additionalBinaryDataProperties); } } }