Skip to content

Commit ade7b6b

Browse files
authored
Boosted non-exhaustive enum deserialization (#7737)
1 parent 5732df0 commit ade7b6b

16 files changed

+39
-14
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information.
4+
5+
namespace Elastic.Clients.Elasticsearch.Core;
6+
7+
internal interface IEnumStruct<TSelf> where TSelf : struct, IEnumStruct<TSelf>
8+
{
9+
// TODO: Can be made static when targeting .NET 7 and higher
10+
TSelf Create(string value);
11+
}

src/Elastic.Clients.Elasticsearch/Serialization/EnumStructConverter.cs

+5-11
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,18 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6-
using System.Reflection;
76
using System.Text.Json;
87
using System.Text.Json.Serialization;
8+
using Elastic.Clients.Elasticsearch.Core;
99

1010
namespace Elastic.Clients.Elasticsearch.Serialization;
1111

12-
internal sealed class EnumStructConverter<T> : JsonConverter<T> where T : new()
12+
internal sealed class EnumStructConverter<T> : JsonConverter<T> where T : struct, IEnumStruct<T>
1313
{
14-
public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
14+
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1515
{
1616
var value = reader.GetString();
17-
18-
var instance = (T)Activator.CreateInstance(
19-
typeof(T),
20-
BindingFlags.Instance | BindingFlags.NonPublic,
21-
args: new object[] { value }, // TODO: Perf - Review use of ArrayPool
22-
binder: null,
23-
culture: null)!;
17+
var instance = default(T).Create(value);
2418

2519
return instance;
2620
}
@@ -30,7 +24,7 @@ public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions
3024
var enumValue = value.ToString();
3125

3226
if (!string.IsNullOrEmpty(enumValue))
33-
writer.WriteStringValue(value.ToString());
27+
writer.WriteStringValue(enumValue);
3428
else
3529
writer.WriteNullValue();
3630
}

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Aggregations.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Aggregations;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Analysis.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Analysis;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Cluster.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Cluster;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Core.Search.g.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Core.Search;
@@ -225,10 +226,12 @@ public override void Write(Utf8JsonWriter writer, HighlighterTagsSchema value, J
225226
}
226227

227228
[JsonConverter(typeof(EnumStructConverter<HighlighterType>))]
228-
public readonly partial struct HighlighterType
229+
public readonly partial struct HighlighterType : IEnumStruct<HighlighterType>
229230
{
230231
public HighlighterType(string value) => Value = value;
231232

233+
HighlighterType IEnumStruct<HighlighterType>.Create(string value) => value;
234+
232235
public readonly string Value { get; }
233236
public static HighlighterType Unified { get; } = new HighlighterType("unified");
234237
public static HighlighterType Plain { get; } = new HighlighterType("plain");

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Enrich.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Enrich;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Eql.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Eql;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.IndexManagement.g.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.IndexManagement;
@@ -497,10 +498,12 @@ public override void Write(Utf8JsonWriter writer, ShardRoutingState value, JsonS
497498
}
498499

499500
[JsonConverter(typeof(EnumStructConverter<StorageType>))]
500-
public readonly partial struct StorageType
501+
public readonly partial struct StorageType : IEnumStruct<StorageType>
501502
{
502503
public StorageType(string value) => Value = value;
503504

505+
StorageType IEnumStruct<StorageType>.Create(string value) => value;
506+
504507
public readonly string Value { get; }
505508

506509
/// <summary>

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Ingest.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Ingest;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Mapping.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Mapping;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Ml.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Ml;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.NoNamespace.g.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch;
@@ -997,10 +998,12 @@ public override void Write(Utf8JsonWriter writer, Result value, JsonSerializerOp
997998
}
998999

9991000
[JsonConverter(typeof(EnumStructConverter<ScriptLanguage>))]
1000-
public readonly partial struct ScriptLanguage
1001+
public readonly partial struct ScriptLanguage : IEnumStruct<ScriptLanguage>
10011002
{
10021003
public ScriptLanguage(string value) => Value = value;
10031004

1005+
ScriptLanguage IEnumStruct<ScriptLanguage>.Create(string value) => value;
1006+
10041007
public readonly string Value { get; }
10051008
public static ScriptLanguage Painless { get; } = new ScriptLanguage("painless");
10061009
public static ScriptLanguage Mustache { get; } = new ScriptLanguage("mustache");

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.QueryDsl.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.QueryDsl;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Tasks.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Tasks;

src/Elastic.Clients.Elasticsearch/_Generated/Types/Enums/Enums.Watcher.g.cs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using System.Text.Json.Serialization;
2323
using System.Runtime.Serialization;
2424
using Elastic.Transport;
25+
using Elastic.Clients.Elasticsearch.Core;
2526
using Elastic.Clients.Elasticsearch.Serialization;
2627

2728
namespace Elastic.Clients.Elasticsearch.Watcher;

0 commit comments

Comments
 (0)