#nullable enable using System; using System.ClientModel.Primitives; using System.Collections.Generic; using System.Text.Json; namespace OpenAI; internal static partial class CustomSerializationHelpers { internal static TOutput DeserializeNewInstance( UInstanceInput existingInstance, Func deserializationFunc, ref Utf8JsonReader reader, ModelReaderWriterOptions options) where UInstanceInput : IJsonModel { options ??= new("W"); var format = options.Format == "W" ? ((IJsonModel)existingInstance).GetFormatFromOptions(options) : options.Format; if (format != "J") { throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format."); } using JsonDocument document = JsonDocument.ParseValue(ref reader); return deserializationFunc.Invoke(document.RootElement, options); } internal static TOutput DeserializeNewInstance( UInstanceInput existingInstance, Func deserializationFunc, BinaryData data, ModelReaderWriterOptions options) where UInstanceInput : IPersistableModel { options ??= new("W"); var format = options.Format == "W" ? ((IPersistableModel)existingInstance).GetFormatFromOptions(options) : options.Format; switch (format) { case "J": { using JsonDocument document = JsonDocument.Parse(data); return deserializationFunc.Invoke(document.RootElement, options)!; } default: throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format."); } } internal static void SerializeInstance( UInstanceInput instance, Action serializationFunc, Utf8JsonWriter writer, ModelReaderWriterOptions options) where UInstanceInput : IJsonModel { options ??= new ModelReaderWriterOptions("W"); AssertSupportedJsonWriteFormat(instance, options); serializationFunc.Invoke(instance, writer, options); } internal static void SerializeInstance( T instance, Action serializationFunc, Utf8JsonWriter writer, ModelReaderWriterOptions options) where T : IJsonModel => SerializeInstance(instance, serializationFunc, writer, options); internal static BinaryData SerializeInstance( UInstanceInput instance, ModelReaderWriterOptions options) where UInstanceInput : IPersistableModel { options ??= new("W"); AssertSupportedPersistableWriteFormat(instance, options); return ModelReaderWriter.Write(instance, options, OpenAIContext.Default); } internal static BinaryData SerializeInstance(T instance, ModelReaderWriterOptions options) where T : IPersistableModel => SerializeInstance(instance, options); internal static void AssertSupportedJsonWriteFormat(T instance, ModelReaderWriterOptions options) where T : IJsonModel => AssertSupportedJsonWriteFormat(instance, options); internal static void AssertSupportedJsonWriteFormat(UInstanceInput instance, ModelReaderWriterOptions options) where UInstanceInput : IJsonModel { var format = options.Format == "W" ? ((IJsonModel)instance).GetFormatFromOptions(options) : options.Format; if (format != "J") { throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format."); } } internal static void AssertSupportedPersistableWriteFormat(T instance, ModelReaderWriterOptions options) where T : IPersistableModel => AssertSupportedPersistableWriteFormat(instance, options); internal static void AssertSupportedPersistableWriteFormat(UInstanceInput instance, ModelReaderWriterOptions options) where UInstanceInput : IPersistableModel { var format = options.Format == "W" ? ((IPersistableModel)instance).GetFormatFromOptions(options) : options.Format; if (format != "J") { throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format."); } } internal static void WriteSerializedAdditionalRawData(this Utf8JsonWriter writer, IDictionary dictionary, ModelReaderWriterOptions options) { if (true && dictionary != null) { foreach (var item in dictionary) { 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 } } } internal static void WriteOptionalProperty(this Utf8JsonWriter writer, ReadOnlySpan name, T value, ModelReaderWriterOptions options) { if (Optional.IsDefined(value)) { writer.WritePropertyName(name); writer.WriteObjectValue(value, options); } } internal static void WriteOptionalCollection(this Utf8JsonWriter writer, ReadOnlySpan name, IEnumerable values, ModelReaderWriterOptions options) { if (Optional.IsCollectionDefined(values)) { writer.WritePropertyName(name); writer.WriteStartArray(); foreach (T item in values) { writer.WriteObjectValue(item, options); } writer.WriteEndArray(); } } internal static void WriteFirstObject(this Utf8JsonWriter writer, ModelReaderWriterOptions options, params T[] values) where T : class, IJsonModel { foreach (T value in values) { if (value is not null) { writer.WriteObjectValue(value, options); break; } } } }