Skip to content

Commit f4c1738

Browse files
committed
Add GetUtf8Name method.
1 parent 7925d25 commit f4c1738

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed

sandbox/ConsoleApp/Enums.cs

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
namespace ConsoleApp;
44

5+
// uncreated.
6+
public enum Variant : byte
7+
{
8+
9+
}
10+
511
public enum IpAddrVariant : byte
612
{
713
[VariantValueType(typeof(byte), typeof(byte), typeof(byte), typeof(byte))]
@@ -11,12 +17,19 @@ public enum IpAddrVariant : byte
1117
None
1218
}
1319

14-
[IgnoreVariant]
1520
public enum TestVariant
1621
{
1722

1823
}
1924

25+
// uncreated.
26+
[IgnoreVariant]
27+
public enum TestIgnoreVariant
28+
{
29+
30+
}
31+
32+
// uncreated.
2033
public class A
2134
{
2235
[IgnoreVariant]

src/VariantEnum/Generator.cs

+34-1
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ private static string EmitMethod(VariantEnumContext context, string variantEnumN
325325
builder.AppendLine($" public static int Count => {context.Members.Length};");
326326
builder.AppendLine(EmitGetName(context, variantEnumName));
327327
builder.AppendLine(EmitGetNames(context, variantEnumName));
328+
builder.AppendLine(EmitGetUtf8Name(context, variantEnumName));
328329
builder.AppendLine(EmitGetNumericValue(context, variantEnumName));
329330
builder.AppendLine(EmitConvertEnum(context, variantEnumName));
330331
builder.AppendLine(EmitParse(context, variantEnumName));
@@ -382,6 +383,38 @@ private static string EmitGetNames(VariantEnumContext context, string variantEnu
382383
return code;
383384
}
384385

386+
private static string EmitGetUtf8Name(VariantEnumContext context, string variantEnumName)
387+
{
388+
var builder = new StringBuilder();
389+
var symbol = context.Symbol;
390+
391+
if (context.Members.Length > 0)
392+
{
393+
builder.AppendLine(@$" return {variantEnumName.ToLower()} switch
394+
{{");
395+
foreach (var m in context.Members)
396+
{
397+
var memberName = m.MemberSyntax.Identifier.Text;
398+
builder.AppendLine($" {memberName} => \"{memberName}\"u8,");
399+
}
400+
builder.AppendLine($" _ => []");
401+
builder.Append(@$" }};");
402+
}
403+
else
404+
{
405+
builder.Append($" return [];");
406+
}
407+
408+
var code = @$"
409+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
410+
public static ReadOnlySpan<byte> GetUtf8Name({variantEnumName} {variantEnumName.ToLower()})
411+
{{
412+
{builder}
413+
}}";
414+
return code;
415+
}
416+
417+
385418
private static string EmitGetNumericValue(VariantEnumContext context, string variantEnumName)
386419
{
387420
var builder = new StringBuilder();
@@ -549,7 +582,7 @@ public static bool TryParse(ReadOnlySpan<char> s, out {variantEnumName} result)
549582
[MethodImpl(MethodImplOptions.AggressiveInlining)]
550583
public static bool TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, [MaybeNullWhen(false)] out {variantEnumName} result)
551584
{{
552-
return TryParse(s, false, null, out result);
585+
return TryParse(s, false, provider, out result);
553586
}}
554587
555588
public static bool TryParse(ReadOnlySpan<char> s, bool ignoreCase, IFormatProvider? provider, [MaybeNullWhen(false)] out {variantEnumName} result)

tests/VariantEnum.Tests/UnitTests.cs

+15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Shouldly;
22
using System.Buffers;
3+
using System.Linq;
34
using System.Runtime.InteropServices.Marshalling;
45
using Xunit;
56

@@ -167,6 +168,20 @@ public void GetNames()
167168
names.Length.ShouldBe(3);
168169
}
169170

171+
[Fact]
172+
public void GetUtf8Name()
173+
{
174+
var v4 = new IpAddr.V4(127, 0, 0, 1);
175+
var v6 = new IpAddr.V6("::1");
176+
var none = new IpAddr.None();
177+
178+
IpAddr.GetUtf8Name(v4).SequenceEqual("V4"u8).ShouldBeTrue();
179+
IpAddr.GetUtf8Name(v6).SequenceEqual("V6"u8).ShouldBeTrue();
180+
IpAddr.GetUtf8Name(none).SequenceEqual("None"u8).ShouldBeTrue();
181+
182+
IpAddr.GetUtf8Name((IpAddr)default).SequenceEqual(""u8).ShouldBeTrue();
183+
}
184+
170185
[Fact]
171186
public void GetNumericValue()
172187
{

0 commit comments

Comments
 (0)