Skip to content

Commit a4fb43f

Browse files
rework enum system for better enum flags
1 parent 9bcbb72 commit a4fb43f

8 files changed

Lines changed: 50 additions & 145 deletions

File tree

Code/ArgumentSystem/Arguments/EnumArgument.cs

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,21 @@ namespace SER.Code.ArgumentSystem.Arguments;
1111

1212
public class EnumArgument<TEnum> : Argument where TEnum : struct, Enum
1313
{
14+
private readonly bool _isFlag;
15+
1416
public EnumArgument(string name) : base(name)
1517
{
1618
HelpInfoStorage.UsedEnums.Add(typeof(TEnum));
19+
20+
if (typeof(TEnum).IsDefined(typeof(FlagsAttribute), false))
21+
{
22+
_isFlag = true;
23+
}
1724
}
18-
19-
public override string InputDescription => $"{typeof(TEnum).GetAccurateName()} enum value - found using 'serhelp {typeof(TEnum).GetAccurateName()}' command";
25+
26+
public override string InputDescription =>
27+
$"{typeof(TEnum).AccurateName} enum value - found using 'serhelp {typeof(TEnum).AccurateName}' command"
28+
+ (_isFlag ? ". Use '|' character to provide multiple e.g. Val1|Val2|Val3" : "");
2029

2130
[UsedImplicitly]
2231
public DynamicTryGet<TEnum> GetConvertSolution(BaseToken token)
@@ -42,19 +51,43 @@ public DynamicTryGet<TEnum> GetConvertSolution(BaseToken token)
4251
});
4352
}
4453

45-
public static TryGet<TEnum> Convert(BaseToken token, Script script)
54+
public static TryGet<TEnum> Convert(BaseToken token, Script script, bool isFlag)
4655
{
47-
if (Convert(token, script, typeof(TEnum)).HasErrored(out var error, out var value))
56+
if (!isFlag)
4857
{
49-
return error;
50-
}
58+
if (ConvertOne(token.GetBestTextRepresentation(script), typeof(TEnum))
59+
.HasErrored(out var error, out var value))
60+
{
61+
return error;
62+
}
5163

52-
return (TEnum)value;
64+
return (TEnum)value;
65+
}
66+
67+
ulong result = 0;
68+
foreach (var part in token
69+
.GetBestTextRepresentation(script)
70+
.Split(['|'], StringSplitOptions.RemoveEmptyEntries))
71+
{
72+
if (ConvertOne(part, typeof(TEnum)).HasErrored(out var error, out var value))
73+
{
74+
return error;
75+
}
76+
77+
result |= System.Convert.ToUInt64(value);
78+
}
79+
80+
return (TEnum)Enum.ToObject(typeof(TEnum), result);
5381
}
5482

55-
public static TryGet<object> Convert(BaseToken token, Script script, Type enumType)
83+
public static TryGet<TEnum> ConvertOne(string stringRep)
5684
{
57-
var stringRep = token.GetBestTextRepresentation(script);
85+
return ConvertOne(stringRep, typeof(TEnum)).OnSuccess(v => (TEnum)v);
86+
}
87+
88+
public static TryGet<object> ConvertOne(string stringRep, Type enumType)
89+
{
90+
stringRep = stringRep.Trim();
5891

5992
// only allow exact matches or matches with the first letter not capitalized
6093
if (Enum.IsDefined(enumType, stringRep) ||
@@ -63,11 +96,11 @@ public static TryGet<object> Convert(BaseToken token, Script script, Type enumTy
6396
return Enum.Parse(enumType, stringRep, true);
6497
}
6598

66-
return $"Value '{token.RawRep}' is not a {enumType.GetAccurateName()} enum value.";
99+
return $"Value '{stringRep}' is not a {enumType.AccurateName} enum value.";
67100
}
68-
101+
69102
private TryGet<TEnum> InternalConvert(BaseToken token)
70103
{
71-
return Convert(token, Script);
104+
return Convert(token, Script, _isFlag);
72105
}
73106
}

Code/ArgumentSystem/Arguments/EnumTypeArgument.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.

Code/ArgumentSystem/Arguments/FlagsArgument.cs

Lines changed: 0 additions & 33 deletions
This file was deleted.

Code/ArgumentSystem/BaseArguments/EnumHandlingArgument.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ public DynamicTryGet<T> ResolveEnums<T>(
1414
{
1515
foreach (var enumType in handlers.Keys)
1616
{
17-
if (EnumArgument< /* dummy type */ RoomName>.Convert(token, Script, enumType).HasErrored(out _, out var enumValue))
17+
if (EnumArgument< /* dummy type */ RoomName>.ConvertOne(token.GetBestTextRepresentation(Script), enumType)
18+
.HasErrored(out _, out var enumValue))
1819
{
1920
continue;
2021
}

Code/ArgumentSystem/ProvidedArguments.cs

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,6 @@ namespace SER.Code.ArgumentSystem;
2222
public class ProvidedArguments(Method method)
2323
{
2424
private Dictionary<(string name, Type type), List<DynamicTryGet>> ArgumentValues { get; } = [];
25-
26-
public T? GetNullableFlags<T>(string argName) where T : struct, Enum
27-
{
28-
return GetValueNullableStruct<T, FlagsArgument<T>>(argName);
29-
}
30-
31-
public T GetFlags<T>(string argName) where T : struct, Enum
32-
{
33-
return GetValue<T, FlagsArgument<T>>(argName);
34-
}
35-
36-
public Type GetEnumType(string argName)
37-
{
38-
return GetValue<Type, EnumTypeArgument>(argName);
39-
}
4025

4126
public T GetVariable<T>(string argName) where T : Variable
4227
{

Code/MethodSystem/Methods/AdminToyPropertyMethods/SetPrimitiveObjectPropertiesMethod.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class SetPrimitiveObjectPropertiesMethod : SynchronousMethod
1919

2020
new EnumArgument<PrimitiveType>("type") { DefaultValue = new(null, "not changing") },
2121
new ColorArgument("color") { DefaultValue = new(null, "not changing") },
22-
new FlagsArgument<PrimitiveFlags>("flags") { DefaultValue = new(null, "not changing") },
22+
new EnumArgument<PrimitiveFlags>("flags") { DefaultValue = new(null, "not changing") },
2323
];
2424

2525
public override void Execute()
@@ -28,6 +28,6 @@ public override void Execute()
2828

2929
if (Args.GetNullableEnum<PrimitiveType>("type") is { } type) toy.Type = type;
3030
if (Args.GetNullableColor("color") is { } color) toy.Color = color;
31-
if (Args.GetNullableFlags<PrimitiveFlags>("flags") is { } flags) toy.Flags = flags;
31+
if (Args.GetNullableEnum<PrimitiveFlags>("flags") is { } flags) toy.Flags = flags;
3232
}
3333
}

Code/MethodSystem/Methods/ParsingMethods/ToFlagsMethod.cs

Lines changed: 0 additions & 56 deletions
This file was deleted.

Code/TokenSystem/Tokens/ExpressionTokens/PlayerExpressionToken.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ protected override IParseResult InternalParse(BaseToken[] tokens)
198198
return new Error(rs + $"A player expression expects to have only one argument, but {tokens.Length - 1} were provided.");
199199
}
200200

201-
if (EnumArgument<PlayerProperty>.Convert(tokens.Last(), Script)
201+
if (EnumArgument<PlayerProperty>.ConvertOne(tokens.Last().GetBestTextRepresentation(Script))
202202
.HasErrored(out var error, out var property))
203203
{
204204
return new Error(rs + error);

0 commit comments

Comments
 (0)