diff --git a/src/Elastic.Transport/Extensions/Extensions.cs b/src/Elastic.Transport/Extensions/Extensions.cs index ea88129..a8579b0 100644 --- a/src/Elastic.Transport/Extensions/Extensions.cs +++ b/src/Elastic.Transport/Extensions/Extensions.cs @@ -7,10 +7,24 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Runtime.Serialization; using System.Text; namespace Elastic.Transport.Extensions; +internal static class EnumExtensions +{ + public static string GetEnumName(this Enum e) + { + var attributes = e.GetType().GetField(e.ToString())?.GetCustomAttributes(typeof(EnumMemberAttribute), false); + if (attributes is null || attributes.Length == 0) + return e.ToString(); + + var enumMember = attributes[0] as EnumMemberAttribute; + return enumMember?.Value ?? e.ToString(); + } +} + internal static class Extensions { [Obsolete("Please use the overload placing the enumerated array as out")] diff --git a/src/Elastic.Transport/Requests/UrlFormatter.cs b/src/Elastic.Transport/Requests/UrlFormatter.cs index 3c151f8..661eb35 100644 --- a/src/Elastic.Transport/Requests/UrlFormatter.cs +++ b/src/Elastic.Transport/Requests/UrlFormatter.cs @@ -49,7 +49,7 @@ public static string CreateString(object? value, ITransportConfiguration setting null => string.Empty, string s => s, string[] ss => string.Join(",", ss), - Enum e => e.ToString(), + Enum e => e.GetEnumName(), bool b => b ? "true" : "false", DateTimeOffset offset => offset.ToString("o"), TimeSpan timeSpan => timeSpan.ToTimeUnit(), diff --git a/tests/Elastic.Transport.Tests/UsageTests.cs b/tests/Elastic.Transport.Tests/UsageTests.cs index 2af893a..88860d8 100644 --- a/tests/Elastic.Transport.Tests/UsageTests.cs +++ b/tests/Elastic.Transport.Tests/UsageTests.cs @@ -3,6 +3,8 @@ // See the LICENSE file in the project root for more information using System; +using System.Collections.Generic; +using System.Runtime.Serialization; using Elastic.Transport.Products; using Elastic.Transport.Products.Elasticsearch; using FluentAssertions; @@ -15,6 +17,31 @@ namespace Elastic.Transport.Tests; public class UsageTests { + private enum MyEnum + { + [EnumMember(Value = "different")] + Value + } + + [Fact] + public void EnumsUseEnumMemberAttribute() + { + var pool = new StaticNodePool([new Node(new Uri("http://localhost:9200"))]); + var requestInvoker = new InMemoryRequestInvoker(); + var serializer = LowLevelRequestResponseSerializer.Instance; + var product = ElasticsearchProductRegistration.Default; + + var settings = new TransportConfiguration(pool, requestInvoker, serializer, product); + var transport = new DistributedTransport(settings); + + var requestParameters = new DefaultRequestParameters { QueryString = + new Dictionary{ { "enum", MyEnum.Value } } }; + var path = requestParameters.CreatePathWithQueryStrings("/", settings); + var response = transport.Request(new EndpointPath(HttpMethod.GET, path), null, null, null); + + response.ApiCallDetails.Uri.Should().Be(new Uri("http://localhost:9200?enum=different")); + } + [Fact] public void TransportVersionIsSet() {