Skip to content

Commit e33ca49

Browse files
committed
extend serdeParseEnum API
1 parent b8148f3 commit e33ca49

1 file changed

Lines changed: 18 additions & 48 deletions

File tree

source/mir/serde.d

Lines changed: 18 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -882,51 +882,10 @@ alias serdeGetTransformOut(alias value) = naryFun!(TemplateArgsOf!(getUDA!(value
882882

883883
/++
884884
+/
885-
bool serdeParseEnum(E)(const char[] str, ref E res)
885+
bool serdeParseEnum(E)(scope const char[] str, ref E res)
886886
@safe pure nothrow @nogc
887+
if (is(E == enum))
887888
{
888-
static if (__VERSION__ < 2093)
889-
{
890-
static if (hasUDA!(E, serdeIgnoreCase))
891-
{
892-
import mir.format: stringBuf;
893-
stringBuf buf;
894-
buf << str;
895-
auto ustr = buf.data.fastToUpperInPlace;
896-
}
897-
else
898-
{
899-
alias ustr = str;
900-
}
901-
switch(ustr)
902-
{
903-
foreach(i, member; EnumMembers!E)
904-
{{
905-
enum initKeys = serdeGetKeysIn(EnumMembers!E[i]);
906-
static if (hasUDA!(E, serdeIgnoreCase))
907-
{
908-
import mir.ndslice.topology: map;
909-
import mir.array.allocation: array;
910-
enum keys = initKeys.map!fastLazyToUpper.map!array.array;
911-
}
912-
else
913-
{
914-
enum keys = initKeys;
915-
}
916-
static assert (keys.length, "At least one input enum key is required");
917-
static foreach (key; keys)
918-
{
919-
case key:
920-
}
921-
res = member;
922-
return true;
923-
}}
924-
default:
925-
return false;
926-
}
927-
}
928-
else
929-
{
930889
import mir.enums: getEnumIndexFromKey, unsafeEnumFromIndex;
931890
import mir.utility: _expect;
932891

@@ -937,7 +896,20 @@ bool serdeParseEnum(E)(const char[] str, ref E res)
937896
return true;
938897
}
939898
return false;
940-
}
899+
}
900+
901+
version(D_Exceptions)
902+
/// ditto
903+
auto serdeParseEnum(E)(scope const char[] str)
904+
@safe pure
905+
if (is(E == enum))
906+
{
907+
import mir.utility: max;
908+
E ret;
909+
if (.serdeParseEnum(str, ret))
910+
return ret;
911+
import mir.exception: MirException;
912+
throw new MirException("Can't deserialzie ", E.stringof, " from string", str[0 .. max($, 128u)]);
941913
}
942914

943915
///
@@ -959,10 +931,8 @@ version(mir_test) unittest
959931
assert(e == E.a);
960932
assert(serdeParseEnum("beta", e));
961933
assert(e == E.b);
962-
assert(serdeParseEnum("B", e));
963-
assert(e == E.b);
964-
assert(serdeParseEnum("c", e));
965-
assert(e == E.c);
934+
assert("B".serdeParseEnum!E == E.b);
935+
assert("c".serdeParseEnum!E == E.c);
966936

967937
assert(!serdeParseEnum("C", e));
968938
assert(!serdeParseEnum("Alpha", e));

0 commit comments

Comments
 (0)