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 · modecode

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