openai/openai-dotnet

Public

mirrored from https://github.com/openai/openai-dotnetAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.0.0-beta.4

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/Utility/CustomSerializationHelpers.cs

129lines · modeblame

9f9f2936Jose Arriaga Maldonado2 years ago1using System;
2using System.ClientModel.Primitives;
3using System.Collections;
4using System.Collections.Generic;
5using System.Text.Json;
6
7namespace OpenAI;
8
9internal static partial class CustomSerializationHelpers
10{
11internal static TOutput DeserializeNewInstance<TOutput,UInstanceInput>(
12UInstanceInput existingInstance,
13Func<JsonElement, ModelReaderWriterOptions?, TOutput> deserializationFunc,
14ref Utf8JsonReader reader,
15ModelReaderWriterOptions options)
16where UInstanceInput : IJsonModel<TOutput>
17{
18options ??= new("W");
19var format = options.Format == "W" ? ((IJsonModel<TOutput>)existingInstance).GetFormatFromOptions(options) : options.Format;
20if (format != "J")
21{
22throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
23}
24
25using JsonDocument document = JsonDocument.ParseValue(ref reader);
26return deserializationFunc.Invoke(document.RootElement, options);
27}
28
29internal static TOutput DeserializeNewInstance<TOutput,UInstanceInput>(
30UInstanceInput existingInstance,
31Func<JsonElement, ModelReaderWriterOptions, TOutput> deserializationFunc,
32BinaryData data,
33ModelReaderWriterOptions options)
34where UInstanceInput : IPersistableModel<TOutput>
35{
36options ??= new("W");
37var format = options.Format == "W" ? ((IPersistableModel<TOutput>)existingInstance).GetFormatFromOptions(options) : options.Format;
38
39switch (format)
40{
41case "J":
42{
43using JsonDocument document = JsonDocument.Parse(data);
44return deserializationFunc.Invoke(document.RootElement, options)!;
45}
46default:
47throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
48}
49}
50
51internal static void SerializeInstance<TOutput,UInstanceInput>(
52UInstanceInput instance,
53Action<UInstanceInput,Utf8JsonWriter,ModelReaderWriterOptions> serializationFunc,
54Utf8JsonWriter writer,
55ModelReaderWriterOptions options)
56where UInstanceInput : IJsonModel<TOutput>
57{
58options ??= new ModelReaderWriterOptions("W");
59AssertSupportedJsonWriteFormat<TOutput, UInstanceInput>(instance, options);
60serializationFunc.Invoke(instance, writer, options);
61}
62
63internal static void SerializeInstance<T>(
64T instance,
65Action<T, Utf8JsonWriter, ModelReaderWriterOptions> serializationFunc,
66Utf8JsonWriter writer,
67ModelReaderWriterOptions options)
68where T : IJsonModel<T>
69=> SerializeInstance<T, T>(instance, serializationFunc, writer, options);
70
71internal static BinaryData SerializeInstance<TOutput, UInstanceInput>(
72UInstanceInput instance,
73ModelReaderWriterOptions options)
74where UInstanceInput : IPersistableModel<TOutput>
75{
76options ??= new("W");
77AssertSupportedPersistableWriteFormat<TOutput, UInstanceInput>(instance, options);
78return ModelReaderWriter.Write(instance, options);
79}
80
81internal static BinaryData SerializeInstance<T>(T instance, ModelReaderWriterOptions options)
82where T : IPersistableModel<T>
83=> SerializeInstance<T, T>(instance, options);
84
85internal static void AssertSupportedJsonWriteFormat<T>(T instance, ModelReaderWriterOptions options)
86where T : IJsonModel<T>
87=> AssertSupportedJsonWriteFormat<T, T>(instance, options);
88
89internal static void AssertSupportedJsonWriteFormat<TOutput,UInstanceInput>(UInstanceInput instance, ModelReaderWriterOptions options)
90where UInstanceInput : IJsonModel<TOutput>
91{
92var format = options.Format == "W" ? ((IJsonModel<TOutput>)instance).GetFormatFromOptions(options) : options.Format;
93if (format != "J")
94{
95throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
96}
97}
98
99internal static void AssertSupportedPersistableWriteFormat<T>(T instance, ModelReaderWriterOptions options)
100where T : IPersistableModel<T>
101=> AssertSupportedPersistableWriteFormat<T, T>(instance, options);
102
103internal static void AssertSupportedPersistableWriteFormat<TOutput,UInstanceInput>(UInstanceInput instance, ModelReaderWriterOptions options)
104where UInstanceInput : IPersistableModel<TOutput>
105{
106var format = options.Format == "W" ? ((IPersistableModel<TOutput>)instance).GetFormatFromOptions(options) : options.Format;
107if (format != "J")
108{
109throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
110}
111}
112
113internal static void WriteSerializedAdditionalRawData(this Utf8JsonWriter writer, IDictionary<string, BinaryData> dictionary, ModelReaderWriterOptions options)
114{
115if (true && dictionary != null)
116{
117foreach (var item in dictionary)
118{
119writer.WritePropertyName(item.Key);
120#if NET6_0_OR_GREATER
121writer.WriteRawValue(item.Value);
122#else
123using JsonDocument document = JsonDocument.Parse(item.Value);
124JsonSerializer.Serialize(writer, document.RootElement);
125#endif
126}
127}
128}
129}