Skip to content

Commit 0403aa7

Browse files
authored
Make Utils.AddParameter<T>() consider EnumMemberAttribute (#660)
* Make Utils.AddParameter<T>() support EnumMemberAttribute * Add test
1 parent 1e153b9 commit 0403aa7

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

NGitLab.Tests/Impl/UtilsTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using NGitLab.Models;
2+
using NUnit.Framework;
3+
4+
namespace NGitLab.Tests.Impl;
5+
6+
public class UtilsTests
7+
{
8+
[TestCase(EventAction.PushedTo, "pushed+to")]
9+
[TestCase(EventAction.Accepted, "Accepted")]
10+
public void AddParameter_ConsidersEnumMemberAttribute(EventAction value, string expectedQueryParamValue)
11+
{
12+
const string basePath = "https://gitlab.org/api/v4/stuff";
13+
var url = basePath;
14+
url = NGitLab.Impl.Utils.AddParameter(url, "event_action", value);
15+
16+
Assert.That(url, Is.EqualTo($"{basePath}?event_action={expectedQueryParamValue}"));
17+
}
18+
}

NGitLab/Impl/Utils.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,35 @@
11
using System;
22
using System.Globalization;
3+
using System.Linq;
34
using System.Net;
5+
using System.Runtime.Serialization;
46

57
namespace NGitLab.Impl;
68

79
internal static class Utils
810
{
911
public static string AddParameter<T>(string url, string parameterName, T value)
1012
{
11-
return Equals(value, null) ? url : AddParameterInternal(url, parameterName, value.ToString());
13+
if (value is null)
14+
return url;
15+
16+
var valueString = value.ToString();
17+
var type = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
18+
if (type.IsEnum)
19+
{
20+
var enumField = type.GetFields().FirstOrDefault(f => string.Equals(f.Name, valueString, StringComparison.Ordinal));
21+
if (enumField is not null)
22+
{
23+
var enumMemberValue = enumField.GetCustomAttributes(typeof(EnumMemberAttribute), inherit: true)
24+
.Cast<EnumMemberAttribute>()
25+
.FirstOrDefault()?
26+
.Value;
27+
if (enumMemberValue is not null)
28+
return AddParameterInternal(url, parameterName, enumMemberValue);
29+
}
30+
}
31+
32+
return AddParameterInternal(url, parameterName, valueString);
1233
}
1334

1435
public static string AddParameter(string url, string parameterName, int? value)

0 commit comments

Comments
 (0)