@@ -13,7 +13,7 @@ module mir.serde;
1313
1414import mir.functional: naryFun;
1515import mir.reflection;
16- import std.traits : TemplateArgsOf, EnumMembers, hasUDA;
16+ import std.traits : TemplateArgsOf, EnumMembers, hasUDA, isAggregateType ;
1717
1818version (D_Exceptions)
1919{
@@ -146,7 +146,7 @@ private template serdeIsAnnotationMemberIn(T)
146146template serdeGetAnnotationMembersIn (T)
147147{
148148 import std.meta : aliasSeqOf, Filter;
149- static if (isSomeStruct ! T)
149+ static if (isAggregateType ! T)
150150 enum string [] serdeGetAnnotationMembersIn = [Filter! (serdeIsAnnotationMemberIn! T, aliasSeqOf! (DeserializableMembers! T))];
151151 else
152152 enum string [] serdeGetAnnotationMembersIn = null ;
@@ -187,7 +187,7 @@ private template serdeIsAnnotationMemberOut(T)
187187template serdeGetAnnotationMembersOut (T)
188188{
189189 import std.meta : aliasSeqOf, Filter;
190- static if (isSomeStruct ! T)
190+ static if (isAggregateType ! T)
191191 enum string [] serdeGetAnnotationMembersOut = [Filter! (serdeIsAnnotationMemberOut! T, aliasSeqOf! (DeserializableMembers! T))];
192192 else
193193 enum string [] serdeGetAnnotationMembersOut = null ;
@@ -233,7 +233,7 @@ struct serdeAlgebraicAnnotation
233233+/
234234template serdeHasAlgebraicAnnotation (T)
235235{
236- static if (isSomeStruct ! T || is (T == enum ))
236+ static if (isAggregateType ! T || is (T == enum ))
237237 {
238238 static if (hasUDA! (T, serdeAlgebraicAnnotation))
239239 {
@@ -993,7 +993,7 @@ template serdeGetFinalProxy(T)
993993 alias serdeGetFinalProxy = .serdeGetFinalProxy! (serdeGetProxy! T);
994994 }
995995 else
996- static if (is (typeof (Timestamp(T.init))))
996+ static if (isAggregateType ! T && is (typeof (Timestamp(T.init))))
997997 {
998998 alias serdeGetFinalProxy = string ;
999999 }
@@ -1039,7 +1039,7 @@ template serdeGetFinalDeepProxy(T)
10391039 alias serdeGetFinalDeepProxy = .serdeGetFinalDeepProxy! (serdeGetProxy! T);
10401040 }
10411041 else
1042- static if (is (typeof (Timestamp(T.init))))
1042+ static if (isAggregateType ! T && is (typeof (Timestamp(T.init))))
10431043 {
10441044 alias serdeGetFinalDeepProxy = string ;
10451045 }
@@ -1049,11 +1049,11 @@ template serdeGetFinalDeepProxy(T)
10491049 alias serdeGetFinalDeepProxy = .serdeGetFinalDeepProxy! (T.serdeKeysProxy);
10501050 }
10511051 else
1052- static if (is (T == enum ))
1053- {
1054- alias serdeGetFinalDeepProxy = typeof (null );
1055- }
1056- else
1052+ // static if (is(T == enum))
1053+ // {
1054+ // alias serdeGetFinalDeepProxy = typeof(null);
1055+ // }
1056+ // else
10571057 {
10581058 alias serdeGetFinalDeepProxy = T;
10591059 }
@@ -1068,7 +1068,7 @@ template serdeGetFinalDeepProxy(T)
10681068 alias serdeGetFinalDeepProxy = T;
10691069 }
10701070 else
1071- static if (is (T == V[K], K, V))
1071+ static if (is (immutable T == immutable V[K], K, V))
10721072 {
10731073 alias E = Unqual! V;
10741074 static if (isAggregateType! E || is (E == enum ))
@@ -1108,9 +1108,12 @@ template serdeFinalProxyDeserializableMembers(T)
11081108{
11091109 import std.meta : Filter, aliasSeqOf;
11101110 alias P = serdeGetFinalProxy! T;
1111- static if (isSomeStruct ! P )
1111+ static if (isAggregateType ! P || is (P == enum ) )
11121112 enum string [] serdeFinalProxyDeserializableMembers = [Filter! (serdeIsDeserializable! P, aliasSeqOf! (DeserializableMembers! P))];
11131113 else
1114+ // static if (is(P == enum))
1115+ // enum string[] serdeFinalProxyDeserializableMembers = serdeGetKeysIn!P;
1116+ // else
11141117 enum string [] serdeFinalProxyDeserializableMembers = null ;
11151118}
11161119
@@ -1144,9 +1147,12 @@ template serdeFinalDeepProxySerializableMembers(T)
11441147 import std.traits : isAggregateType;
11451148 import std.meta : Filter, aliasSeqOf;
11461149 alias P = serdeGetFinalDeepProxy! T;
1147- static if (isSomeStruct ! P )
1150+ static if (isAggregateType ! P || is (P == enum ) )
11481151 enum string [] serdeFinalDeepProxySerializableMembers = [Filter! (serdeIsSerializable! P, aliasSeqOf! (SerializableMembers! P))];
11491152 else
1153+ // static if (is(P == enum))
1154+ // enum string[] serdeFinalDeepProxySerializableMembers = [serdeGetKeyOut!P];
1155+ // else
11501156 enum string [] serdeFinalDeepProxySerializableMembers = null ;
11511157}
11521158
@@ -1179,9 +1185,12 @@ template serdeFinalProxySerializableMembers(T)
11791185{
11801186 import std.meta : Filter, aliasSeqOf;
11811187 alias P = serdeGetFinalProxy! T;
1182- static if (isSomeStruct ! P )
1188+ static if (isAggregateType ! P || is (P == enum ) )
11831189 enum string [] serdeFinalProxySerializableMembers = [Filter! (serdeIsSerializable! P, aliasSeqOf! (SerializableMembers! P))];
11841190 else
1191+ // static if (is(P == enum))
1192+ // enum string[] serdeFinalProxySerializableMembers = [serdeGetKeyOut!P];
1193+ // else
11851194 enum string [] serdeFinalProxySerializableMembers = null ;
11861195}
11871196
@@ -1215,16 +1224,18 @@ template serdeFinalDeepProxyDeserializableMembers(T)
12151224 import std.traits : isAggregateType;
12161225 import std.meta : Filter, aliasSeqOf;
12171226 alias P = serdeGetFinalDeepProxy! T;
1218- static if (isAggregateType! P)
1227+ static if (isAggregateType! P || is (P == enum ) )
12191228 enum string [] serdeFinalDeepProxyDeserializableMembers = [Filter! (serdeIsDeserializable! P, aliasSeqOf! (DeserializableMembers! P))];
12201229 else
1230+ // static if (is(P == enum))
1231+ // enum string[] serdeFinalDeepProxyDeserializableMembers = serdeGetKeysIn!P;
1232+ // else
12211233 enum string [] serdeFinalDeepProxyDeserializableMembers = null ;
12221234}
12231235
12241236// /
12251237version (mir_test) unittest
12261238{
1227-
12281239 static struct A
12291240 {
12301241 @serdeIgnore
@@ -1698,6 +1709,11 @@ private template serdeFinalDeepProxyDeserializableMemberKeys(T)
16981709 else
16991710 enum string [] serdeFinalDeepProxyDeserializableMemberKeys = [staticMap! (aliasSeqOf, staticMap! (serdeGetKeysIn2! T, aliasSeqOf! (serdeFinalDeepProxyDeserializableMembers! T)))];
17001711 }
1712+ else
1713+ static if (is (T == enum ))
1714+ {
1715+ enum string [] serdeFinalDeepProxyDeserializableMemberKeys = enumAllKeysIn! T;
1716+ }
17011717 else
17021718 enum string [] serdeFinalDeepProxyDeserializableMemberKeys = null ;
17031719}
@@ -1721,13 +1737,18 @@ private template serdeFinalDeepProxySerializableMemberKeys(T)
17211737 else
17221738 enum string [] serdeFinalDeepProxySerializableMemberKeys = [staticMap! (aliasSeqOf, staticMap! (serdeGetKeyOut2! T, aliasSeqOf! (serdeFinalDeepProxySerializableMembers! T)))];
17231739 }
1740+ else
1741+ static if (is (T == enum ))
1742+ {
1743+ enum string [] serdeFinalDeepProxySerializableMemberKeys = enumAllKeysOut! T;
1744+ }
17241745 else
17251746 enum string [] serdeFinalDeepProxySerializableMemberKeys = null ;
17261747}
17271748
17281749private template serdeGetAlgebraicAnnotations (T)
17291750{
1730- static if (isSomeStruct ! T || is (T == enum ))
1751+ static if (isAggregateType ! T || is (T == enum ))
17311752 static if (hasUDA! (T, serdeAlgebraicAnnotation))
17321753 enum string [] serdeGetAlgebraicAnnotations = [getUDA! (T, serdeAlgebraicAnnotation).annotation];
17331754 else
@@ -1794,22 +1815,26 @@ version(mir_test) unittest
17941815 @serdeProxy! (B[])
17951816 static interface E { int f() @property ; }
17961817
1818+ enum N { a, b }
1819+
17971820 static class D
17981821 {
17991822 C c;
18001823
18011824 @serdeProxy! (E[])
18021825 int d;
1826+
1827+ N e;
18031828 }
18041829
18051830 @serdeAlgebraicAnnotation(" $F" )
18061831 @serdeProxy! D
18071832 static struct F { int f; }
18081833
1809- static assert (serdeGetSerializationKeysRecurse! F == [" c" , " d" , " g" ]);
1834+ static assert (serdeGetSerializationKeysRecurse! F == [" a " , " b " , " c" , " d" , " e " , " g" ]);
18101835
18111836 import mir.algebraic;
1812- static assert (serdeGetSerializationKeysRecurse! (Nullable! (F, int )) == [" c" , " d" , " g" , " $F" ]);
1837+ static assert (serdeGetSerializationKeysRecurse! (Nullable! (F, int )) == [" a " , " b " , " c" , " d" , " e " , " g" , " $F" ]);
18131838}
18141839
18151840/+ +
@@ -1836,22 +1861,28 @@ version(mir_test) unittest
18361861 @serdeProxy! (B[])
18371862 static interface E { int f() @property ; }
18381863
1864+ enum N { a, b }
1865+
18391866 static class D
18401867 {
18411868 C c;
18421869
18431870 @serdeProxy! (E[])
18441871 int d;
1872+
1873+ N e;
18451874 }
18461875
18471876 @serdeAlgebraicAnnotation(" $F" )
18481877 @serdeProxy! D
18491878 static struct F { int f; }
18501879
1851- static assert (serdeGetDeserializationKeysRecurse! F == [" c" , " d" , " g" ]);
1880+ static assert (serdeGetDeserializationKeysRecurse! N == [" a" , " b" ], serdeGetDeserializationKeysRecurse! N);
1881+
1882+ static assert (serdeGetDeserializationKeysRecurse! F == [" a" , " b" , " c" , " d" , " e" , " g" ]);
18521883
18531884 import mir.algebraic;
1854- static assert (serdeGetDeserializationKeysRecurse! (Nullable! (F, int )) == [" c" , " d" , " g" , " $F" ]);
1885+ static assert (serdeGetDeserializationKeysRecurse! (Nullable! (F, int )) == [" a " , " b " , " c" , " d" , " e " , " g" , " $F" ]);
18551886}
18561887
18571888/+ +
@@ -1890,7 +1921,7 @@ enum serdeAlphabetOut;
18901921A dummy structure usefull $(LREF serdeOrderedIn) support.
18911922+/
18921923struct SerdeOrderedDummy (T, bool __optionalByDefault = false )
1893- if (is (serdeGetFinalProxy! T == T) && isSomeStruct !T)
1924+ if (is (serdeGetFinalProxy! T == T) && isAggregateType !T)
18941925{
18951926 import std.traits : hasUDA;
18961927
@@ -1925,7 +1956,7 @@ public:
19251956 mixin (" @(__traits(getAttributes, T." ~ member ~ " )) serdeDeserializationMemberType!(T, `" ~ member ~ " `) " ~ member ~ " ;" );
19261957 }
19271958 else
1928- static if (isSomeStruct ! (typeof (__traits(getMember, T, member))))
1959+ static if (isAggregateType ! (typeof (__traits(getMember, T, member))))
19291960 {
19301961 static if (hasUDA! (typeof (__traits(getMember, T, member)), serdeProxy))
19311962 {
@@ -2192,3 +2223,19 @@ char[] fastToUpperInPlace()(scope return char[] a)
21922223 e = e.fastToUpper;
21932224 return a;
21942225}
2226+
2227+ template enumAllKeysIn (T)
2228+ if (is (T == enum ))
2229+ {
2230+ import std.traits : EnumMembers;
2231+ import std.meta : staticMap, aliasSeqOf;
2232+ enum string [] enumAllKeysIn = [staticMap! (aliasSeqOf, staticMap! (.serdeGetKeysIn, EnumMembers! T))];
2233+ }
2234+
2235+ template enumAllKeysOut (T)
2236+ if (is (T == enum ))
2237+ {
2238+ import std.traits : EnumMembers;
2239+ import std.meta : staticMap, aliasSeqOf;
2240+ enum string [] enumAllKeysOut = [staticMap! (.serdeGetKeyOut, EnumMembers! T)];
2241+ }
0 commit comments