openai/openai-dotnet

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.2.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/Utility/CustomSerializationHelpers.cs

167lines · modeblame

45fc4d72Stephen Toub2 years ago1#nullable enable
2
9f9f2936Jose Arriaga Maldonado2 years ago3using System;
4using System.ClientModel.Primitives;
5using System.Collections.Generic;
6using System.Text.Json;
7
8namespace OpenAI;
9
10internal static partial class CustomSerializationHelpers
11{
79014abcShivangiReja1 years ago12internal static TOutput DeserializeNewInstance<TOutput, UInstanceInput>(
9f9f2936Jose Arriaga Maldonado2 years ago13UInstanceInput existingInstance,
14Func<JsonElement, ModelReaderWriterOptions?, TOutput> deserializationFunc,
15ref Utf8JsonReader reader,
16ModelReaderWriterOptions options)
17where UInstanceInput : IJsonModel<TOutput>
18{
19options ??= new("W");
20var format = options.Format == "W" ? ((IJsonModel<TOutput>)existingInstance).GetFormatFromOptions(options) : options.Format;
21if (format != "J")
22{
23throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
24}
25
26using JsonDocument document = JsonDocument.ParseValue(ref reader);
27return deserializationFunc.Invoke(document.RootElement, options);
28}
29
79014abcShivangiReja1 years ago30internal static TOutput DeserializeNewInstance<TOutput, UInstanceInput>(
9f9f2936Jose Arriaga Maldonado2 years ago31UInstanceInput existingInstance,
32Func<JsonElement, ModelReaderWriterOptions, TOutput> deserializationFunc,
33BinaryData data,
34ModelReaderWriterOptions options)
35where UInstanceInput : IPersistableModel<TOutput>
36{
37options ??= new("W");
38var format = options.Format == "W" ? ((IPersistableModel<TOutput>)existingInstance).GetFormatFromOptions(options) : options.Format;
39
40switch (format)
41{
42case "J":
43{
44using JsonDocument document = JsonDocument.Parse(data);
45return deserializationFunc.Invoke(document.RootElement, options)!;
46}
47default:
48throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
49}
50}
51
79014abcShivangiReja1 years ago52internal static void SerializeInstance<TOutput, UInstanceInput>(
9f9f2936Jose Arriaga Maldonado2 years ago53UInstanceInput instance,
79014abcShivangiReja1 years ago54Action<UInstanceInput, Utf8JsonWriter, ModelReaderWriterOptions> serializationFunc,
9f9f2936Jose Arriaga Maldonado2 years ago55Utf8JsonWriter writer,
56ModelReaderWriterOptions options)
57where UInstanceInput : IJsonModel<TOutput>
58{
59options ??= new ModelReaderWriterOptions("W");
60AssertSupportedJsonWriteFormat<TOutput, UInstanceInput>(instance, options);
61serializationFunc.Invoke(instance, writer, options);
62}
63
64internal static void SerializeInstance<T>(
65T instance,
66Action<T, Utf8JsonWriter, ModelReaderWriterOptions> serializationFunc,
67Utf8JsonWriter writer,
68ModelReaderWriterOptions options)
69where T : IJsonModel<T>
70=> SerializeInstance<T, T>(instance, serializationFunc, writer, options);
71
72internal static BinaryData SerializeInstance<TOutput, UInstanceInput>(
73UInstanceInput instance,
74ModelReaderWriterOptions options)
75where UInstanceInput : IPersistableModel<TOutput>
76{
77options ??= new("W");
78AssertSupportedPersistableWriteFormat<TOutput, UInstanceInput>(instance, options);
79return ModelReaderWriter.Write(instance, options);
80}
81
82internal static BinaryData SerializeInstance<T>(T instance, ModelReaderWriterOptions options)
83where T : IPersistableModel<T>
84=> SerializeInstance<T, T>(instance, options);
85
86internal static void AssertSupportedJsonWriteFormat<T>(T instance, ModelReaderWriterOptions options)
87where T : IJsonModel<T>
88=> AssertSupportedJsonWriteFormat<T, T>(instance, options);
89
79014abcShivangiReja1 years ago90internal static void AssertSupportedJsonWriteFormat<TOutput, UInstanceInput>(UInstanceInput instance, ModelReaderWriterOptions options)
9f9f2936Jose Arriaga Maldonado2 years ago91where UInstanceInput : IJsonModel<TOutput>
92{
93var format = options.Format == "W" ? ((IJsonModel<TOutput>)instance).GetFormatFromOptions(options) : options.Format;
94if (format != "J")
95{
96throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
97}
98}
99
100internal static void AssertSupportedPersistableWriteFormat<T>(T instance, ModelReaderWriterOptions options)
101where T : IPersistableModel<T>
102=> AssertSupportedPersistableWriteFormat<T, T>(instance, options);
103
79014abcShivangiReja1 years ago104internal static void AssertSupportedPersistableWriteFormat<TOutput, UInstanceInput>(UInstanceInput instance, ModelReaderWriterOptions options)
9f9f2936Jose Arriaga Maldonado2 years ago105where UInstanceInput : IPersistableModel<TOutput>
106{
107var format = options.Format == "W" ? ((IPersistableModel<TOutput>)instance).GetFormatFromOptions(options) : options.Format;
108if (format != "J")
109{
110throw new FormatException($"The model {nameof(UInstanceInput)} does not support '{format}' format.");
111}
112}
113
114internal static void WriteSerializedAdditionalRawData(this Utf8JsonWriter writer, IDictionary<string, BinaryData> dictionary, ModelReaderWriterOptions options)
115{
116if (true && dictionary != null)
117{
118foreach (var item in dictionary)
119{
120writer.WritePropertyName(item.Key);
121#if NET6_0_OR_GREATER
122writer.WriteRawValue(item.Value);
123#else
124using JsonDocument document = JsonDocument.Parse(item.Value);
125JsonSerializer.Serialize(writer, document.RootElement);
126#endif
127}
128}
129}
3467b535Travis Wilson1 years ago130
131internal static void WriteOptionalProperty<T>(this Utf8JsonWriter writer, ReadOnlySpan<byte> name, T value, ModelReaderWriterOptions options)
132{
133if (Optional.IsDefined(value))
134{
135writer.WritePropertyName(name);
136writer.WriteObjectValue(value, options);
137}
138}
139
140internal static void WriteOptionalCollection<T>(this Utf8JsonWriter writer, ReadOnlySpan<byte> name, IEnumerable<T> values, ModelReaderWriterOptions options)
141{
142if (Optional.IsCollectionDefined(values))
143{
144writer.WritePropertyName(name);
145writer.WriteStartArray();
146foreach (T item in values)
147{
148writer.WriteObjectValue(item, options);
149}
150writer.WriteEndArray();
151}
152}
0ca4c062Jose Arriaga Maldonado1 years ago153
154internal static void WriteFirstObject<T>(this Utf8JsonWriter writer, ModelReaderWriterOptions options, params T[] values)
155where T : class, IJsonModel<T>
156{
157foreach (T value in values)
158{
159if (value is not null)
160{
161writer.WriteObjectValue(value, options);
162break;
163}
164}
165
166}
9f9f2936Jose Arriaga Maldonado2 years ago167}