@@ -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