Skip to content

Commit 9702e20

Browse files
committed
Support custom JsonSerializerOptions
1 parent 1d8eb2b commit 9702e20

File tree

68 files changed

+474
-162
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+474
-162
lines changed

src/Elastic.Clients.Elasticsearch/Api/CreateRequest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ public CreateRequest(TDocument documentWithId, IndexName index = null, Id id = n
1919
: this(index ?? typeof(TDocument), id ?? Id.From(documentWithId)) =>
2020
Document = documentWithId;
2121

22-
public void WriteJson(Utf8JsonWriter writer, Serializer sourceSerializer) => SourceSerialisation.Serialize(Document, writer, sourceSerializer);
22+
public void WriteJson(Utf8JsonWriter writer, Serializer sourceSerializer) => SourceSerialization.Serialize(Document, writer, sourceSerializer);
2323
}

src/Elastic.Clients.Elasticsearch/Api/IndexRequest.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public IndexRequest() : this(typeof(TDocument)) { }
2424

2525
[JsonIgnore] private Id? Id => RouteValues.Get<Id>("id");
2626

27-
void ICustomJsonWriter.WriteJson(Utf8JsonWriter writer, Serializer sourceSerializer) => SourceSerialisation.Serialize(Document, writer, sourceSerializer);
27+
void ICustomJsonWriter.WriteJson(Utf8JsonWriter writer, Serializer sourceSerializer) => SourceSerialization.Serialize(Document, writer, sourceSerializer);
2828

2929
internal static HttpMethod GetHttpMethod(IndexRequest<TDocument> request) =>
3030
request.Id?.StringOrLongValue != null || request.RouteValues.ContainsId ? HttpMethod.PUT : HttpMethod.POST;
@@ -40,7 +40,7 @@ public IndexRequestDescriptor<TDocument> Document(TDocument document)
4040

4141
internal Id _id;
4242

43-
public void WriteJson(Utf8JsonWriter writer, Serializer sourceSerializer) => SourceSerialisation.Serialize(DocumentValue, writer, sourceSerializer);
43+
public void WriteJson(Utf8JsonWriter writer, Serializer sourceSerializer) => SourceSerialization.Serialize(DocumentValue, writer, sourceSerializer);
4444

4545
protected override HttpMethod? DynamicHttpMethod => _id is not null || RouteValues.ContainsId ? HttpMethod.PUT : HttpMethod.POST;
4646
}

src/Elastic.Clients.Elasticsearch/Core/Configuration/ElasticsearchClientSettings.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,14 @@ protected ElasticsearchClientSettingsBase(
115115
: base(nodePool, connection, null, ElasticsearchClientProductRegistration.DefaultForElasticsearchClientsElasticsearch)
116116
{
117117
var requestResponseSerializer = new DefaultRequestResponseSerializer(this);
118-
var sourceSerializer = sourceSerializerFactory?.Invoke(requestResponseSerializer, this) ?? new DefaultSourceSerializer(this);
118+
Serializer sourceSerializer = new DefaultSourceSerializer(this);
119119

120120
_propertyMappingProvider = propertyMappingProvider ?? sourceSerializer as IPropertyMappingProvider ?? new DefaultPropertyMappingProvider();
121121

122122
// TODO - Serializer implementations should directly call diagnostics to avoid wrapping
123123
//We wrap these in an internal proxy to facilitate serialization diagnostics
124124
//_sourceSerializer = new DiagnosticsSerializerProxy(sourceSerializer, "source");
125-
_sourceSerializer = sourceSerializer;
125+
_sourceSerializer = sourceSerializerFactory?.Invoke(sourceSerializer, this) ?? sourceSerializer;
126126

127127
//UseThisRequestResponseSerializer = new DiagnosticsSerializerProxy(defaultSerializer);
128128
UseThisRequestResponseSerializer = requestResponseSerializer;

src/Elastic.Clients.Elasticsearch/Core/Exceptions/ThrowHelper.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ internal static class ThrowHelper
1515

1616
[MethodImpl(MethodImplOptions.NoInlining)]
1717
internal static void ThrowUnknownTaggedUnionVariantJsonException(string variantTag, Type interfaceType) =>
18-
throw new JsonException($"Encounted an unsupported variant tag '{variantTag}' on '{SimplifiedFullName(interfaceType)}', which could not be deserialised.");
18+
throw new JsonException($"Encountered an unsupported variant tag '{variantTag}' on '{SimplifiedFullName(interfaceType)}', which could not be deserialized.");
1919

2020
[MethodImpl(MethodImplOptions.NoInlining)]
2121
internal static void ThrowInvalidOperationException(string message) =>
@@ -25,4 +25,7 @@ internal static void ThrowInvalidOperationException(string message) =>
2525
#pragma warning disable IDE0057 // Use range operator
2626
private static string SimplifiedFullName(Type type) => type.FullName.Substring(30);
2727
#pragma warning restore IDE0057 // Use range operator
28+
29+
[MethodImpl(MethodImplOptions.NoInlining)]
30+
internal static void ThrowJsonExceptionForMissingSettings() => throw new JsonException("Unable to retrieve client settings for JsonSerializerOptions.");
2831
}

src/Elastic.Clients.Elasticsearch/Core/Fields/FieldValue.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -374,9 +374,9 @@ public override void Write(Utf8JsonWriter writer, FieldValue value, JsonSerializ
374374
else if (value.TryGetComposite(out var objectValue))
375375
{
376376
if (!options.TryGetClientSettings(out var settings))
377-
throw new JsonException("Unable to retrieve ElasticsearchClientSettings in order to access source serializer.");
377+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
378378

379-
SourceSerialisation.Serialize(objectValue, objectValue.GetType(), writer, settings);
379+
SourceSerialization.Serialize(objectValue, objectValue.GetType(), writer, settings);
380380
}
381381

382382
else if (value.Kind == FieldValue.ValueKind.Null)

src/Elastic.Clients.Elasticsearch/Core/Fields/FieldValues.cs

+15-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Linq.Expressions;
99
using System.Text.Json;
1010
using System.Text.Json.Serialization;
11+
using Elastic.Clients.Elasticsearch.Serialization;
1112

1213
namespace Elastic.Clients.Elasticsearch;
1314

@@ -98,12 +99,12 @@ private TValue[] FieldArray<TValue>(string field)
9899

99100
internal sealed class FieldValuesConverter : JsonConverter<FieldValues>
100101
{
101-
private readonly IElasticsearchClientSettings _settings;
102-
103-
public FieldValuesConverter(IElasticsearchClientSettings settings) => _settings = settings;
102+
private IElasticsearchClientSettings _settings;
104103

105104
public override FieldValues? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
106105
{
106+
InitializeSettings(options);
107+
107108
if (reader.TokenType != JsonTokenType.StartObject)
108109
{
109110
return null;
@@ -126,4 +127,15 @@ internal sealed class FieldValuesConverter : JsonConverter<FieldValues>
126127
}
127128

128129
public override void Write(Utf8JsonWriter writer, FieldValues value, JsonSerializerOptions options) => throw new NotImplementedException();
130+
131+
private void InitializeSettings(JsonSerializerOptions options)
132+
{
133+
if (_settings is null)
134+
{
135+
if (!options.TryGetClientSettings(out var settings))
136+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
137+
138+
_settings = settings;
139+
}
140+
}
129141
}

src/Elastic.Clients.Elasticsearch/Core/Infer/Field/FieldConverter.cs

+20-4
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55
using System;
66
using System.Text.Json;
77
using System.Text.Json.Serialization;
8+
using Elastic.Clients.Elasticsearch.Serialization;
89
using Elastic.Transport;
910

1011
namespace Elastic.Clients.Elasticsearch;
1112

1213
internal sealed class FieldConverter : JsonConverter<Field>
1314
{
14-
private readonly IElasticsearchClientSettings _settings;
15+
private IElasticsearchClientSettings _settings;
1516

16-
public FieldConverter(IElasticsearchClientSettings settings) => _settings = settings;
17-
18-
public override void WriteAsPropertyName(Utf8JsonWriter writer, Field value, JsonSerializerOptions options) => writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
17+
public override void WriteAsPropertyName(Utf8JsonWriter writer, Field value, JsonSerializerOptions options)
18+
{
19+
InitializeSettings(options);
20+
writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
21+
}
1922

2023
public override Field ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString();
2124

@@ -72,6 +75,8 @@ private static Field ReadObjectField(ref Utf8JsonReader reader)
7275

7376
public override void Write(Utf8JsonWriter writer, Field value, JsonSerializerOptions options)
7477
{
78+
InitializeSettings(options);
79+
7580
if (value is null)
7681
{
7782
writer.WriteNullValue();
@@ -94,4 +99,15 @@ public override void Write(Utf8JsonWriter writer, Field value, JsonSerializerOpt
9499
writer.WriteEndObject();
95100
}
96101
}
102+
103+
private void InitializeSettings(JsonSerializerOptions options)
104+
{
105+
if (_settings is null)
106+
{
107+
if (!options.TryGetClientSettings(out var settings))
108+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
109+
110+
_settings = settings;
111+
}
112+
}
97113
}

src/Elastic.Clients.Elasticsearch/Core/Infer/Id/IdConverter.cs

+19-4
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55
using System;
66
using System.Text.Json;
77
using System.Text.Json.Serialization;
8+
using Elastic.Clients.Elasticsearch.Serialization;
89
using Elastic.Transport;
910

1011
namespace Elastic.Clients.Elasticsearch;
1112

1213
internal sealed class IdConverter : JsonConverter<Id>
1314
{
14-
private readonly IElasticsearchClientSettings _settings;
15+
private IElasticsearchClientSettings? _settings;
1516

16-
public IdConverter(IElasticsearchClientSettings settings) => _settings = settings;
17-
18-
public override void WriteAsPropertyName(Utf8JsonWriter writer, Id value, JsonSerializerOptions options) => writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
17+
public override void WriteAsPropertyName(Utf8JsonWriter writer, Id value, JsonSerializerOptions options)
18+
{
19+
InitializeSettings(options);
20+
writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
21+
}
1922

2023
public override Id ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString();
2124

@@ -34,6 +37,7 @@ public override void Write(Utf8JsonWriter writer, Id value, JsonSerializerOption
3437

3538
if (value.Document is not null)
3639
{
40+
InitializeSettings(options);
3741
var documentId = _settings.Inferrer.Id(value.Document.GetType(), value.Document);
3842
writer.WriteStringValue(documentId);
3943
}
@@ -46,4 +50,15 @@ public override void Write(Utf8JsonWriter writer, Id value, JsonSerializerOption
4650
writer.WriteStringValue(value.StringValue);
4751
}
4852
}
53+
54+
private void InitializeSettings(JsonSerializerOptions options)
55+
{
56+
if (_settings is null)
57+
{
58+
if (!options.TryGetClientSettings(out var settings))
59+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
60+
61+
_settings = settings;
62+
}
63+
}
4964
}

src/Elastic.Clients.Elasticsearch/Core/Infer/Id/Ids.cs

-4
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,6 @@ public override int GetHashCode()
8787

8888
internal sealed class IdsConverter : JsonConverter<Ids>
8989
{
90-
private readonly IElasticsearchClientSettings _settings;
91-
92-
public IdsConverter(IElasticsearchClientSettings settings) => _settings = settings;
93-
9490
public override Ids? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
9591
{
9692
if (reader.TokenType != JsonTokenType.StartArray)

src/Elastic.Clients.Elasticsearch/Core/Infer/IndexName/IndexNameConverter.cs

+20-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System;
66
using System.Text.Json;
77
using System.Text.Json.Serialization;
8+
using Elastic.Clients.Elasticsearch.Serialization;
89
using Elastic.Transport;
910

1011
namespace Elastic.Clients.Elasticsearch;
@@ -14,11 +15,13 @@ namespace Elastic.Clients.Elasticsearch;
1415
/// </summary>
1516
internal class IndexNameConverter : JsonConverter<IndexName?>
1617
{
17-
private readonly IElasticsearchClientSettings _settings;
18+
private IElasticsearchClientSettings _settings;
1819

19-
public IndexNameConverter(IElasticsearchClientSettings settings) => _settings = settings;
20-
21-
public override void WriteAsPropertyName(Utf8JsonWriter writer, IndexName value, JsonSerializerOptions options) => writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
20+
public override void WriteAsPropertyName(Utf8JsonWriter writer, IndexName value, JsonSerializerOptions options)
21+
{
22+
InitializeSettings(options);
23+
writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
24+
}
2225

2326
public override IndexName ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString();
2427

@@ -36,6 +39,8 @@ internal class IndexNameConverter : JsonConverter<IndexName?>
3639

3740
public override void Write(Utf8JsonWriter writer, IndexName? value, JsonSerializerOptions options)
3841
{
42+
InitializeSettings(options);
43+
3944
if (value is null)
4045
{
4146
writer.WriteNullValue();
@@ -44,4 +49,15 @@ public override void Write(Utf8JsonWriter writer, IndexName? value, JsonSerializ
4449

4550
writer.WriteStringValue(_settings.Inferrer.IndexName(value));
4651
}
52+
53+
private void InitializeSettings(JsonSerializerOptions options)
54+
{
55+
if (_settings is null)
56+
{
57+
if (!options.TryGetClientSettings(out var settings))
58+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
59+
60+
_settings = settings;
61+
}
62+
}
4763
}

src/Elastic.Clients.Elasticsearch/Core/Infer/Indices/Indices.cs

+15-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Linq;
1010
using System.Text.Json;
1111
using System.Text.Json.Serialization;
12+
using Elastic.Clients.Elasticsearch.Serialization;
1213
using Elastic.Transport;
1314

1415
namespace Elastic.Clients.Elasticsearch;
@@ -191,9 +192,7 @@ public override int GetHashCode()
191192

192193
internal sealed class IndicesJsonConverter : JsonConverter<Indices>
193194
{
194-
private readonly IElasticsearchClientSettings _settings;
195-
196-
public IndicesJsonConverter(IElasticsearchClientSettings settings) => _settings = settings;
195+
private IElasticsearchClientSettings _settings;
197196

198197
public override Indices? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
199198
{
@@ -219,6 +218,8 @@ internal sealed class IndicesJsonConverter : JsonConverter<Indices>
219218

220219
public override void Write(Utf8JsonWriter writer, Indices value, JsonSerializerOptions options)
221220
{
221+
InitializeSettings(options);
222+
222223
if (value == null)
223224
{
224225
writer.WriteNullValue();
@@ -227,4 +228,15 @@ public override void Write(Utf8JsonWriter writer, Indices value, JsonSerializerO
227228

228229
writer.WriteStringValue(((IUrlParameter)value).GetString(_settings));
229230
}
231+
232+
private void InitializeSettings(JsonSerializerOptions options)
233+
{
234+
if (_settings is null)
235+
{
236+
if (!options.TryGetClientSettings(out var settings))
237+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
238+
239+
_settings = settings;
240+
}
241+
}
230242
}

src/Elastic.Clients.Elasticsearch/Core/Infer/JoinFieldConverter.cs

+16-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
using System.Text.Json.Serialization;
77
using System.Text.Json;
88
using Elastic.Transport;
9+
using Elastic.Clients.Elasticsearch.Serialization;
10+
using System.Runtime;
911

1012
namespace Elastic.Clients.Elasticsearch;
1113

1214
internal sealed class JoinFieldConverter : JsonConverter<JoinField>
1315
{
14-
private readonly IElasticsearchClientSettings _elasticsearchClientSettings;
15-
16-
public JoinFieldConverter(IElasticsearchClientSettings elasticsearchClientSettings) => _elasticsearchClientSettings = elasticsearchClientSettings;
16+
private IElasticsearchClientSettings _settings;
1717

1818
public override JoinField? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1919
{
@@ -67,14 +67,26 @@ public override void Write(Utf8JsonWriter writer, JoinField value, JsonSerialize
6767
break;
6868

6969
case 1:
70+
InitializeSettings(options);
7071
writer.WriteStartObject();
7172
writer.WritePropertyName("name");
7273
JsonSerializer.Serialize(writer, value.ChildOption.Name, options);
7374
writer.WritePropertyName("parent");
74-
var id = (value.ChildOption.ParentId as IUrlParameter)?.GetString(_elasticsearchClientSettings);
75+
var id = (value.ChildOption.ParentId as IUrlParameter)?.GetString(_settings);
7576
writer.WriteStringValue(id);
7677
writer.WriteEndObject();
7778
break;
7879
}
7980
}
81+
82+
private void InitializeSettings(JsonSerializerOptions options)
83+
{
84+
if (_settings is null)
85+
{
86+
if (!options.TryGetClientSettings(out var settings))
87+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
88+
89+
_settings = settings;
90+
}
91+
}
8092
}

0 commit comments

Comments
 (0)