Skip to content

Commit ec05870

Browse files
committed
Merge branch 'master' of https://github.com/libmir/mir-algorithm
2 parents 7b9fdb7 + 01ac21b commit ec05870

File tree

1 file changed

+71
-24
lines changed

1 file changed

+71
-24
lines changed

source/mir/serde.d

Lines changed: 71 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module mir.serde;
1313

1414
import mir.functional: naryFun;
1515
import mir.reflection;
16-
import std.traits: TemplateArgsOf, EnumMembers, hasUDA;
16+
import std.traits: TemplateArgsOf, EnumMembers, hasUDA, isAggregateType;
1717

1818
version (D_Exceptions)
1919
{
@@ -146,7 +146,7 @@ private template serdeIsAnnotationMemberIn(T)
146146
template 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)
187187
template 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
+/
234234
template 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
///
12251237
version(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

17281749
private 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;
18901921
A dummy structure usefull $(LREF serdeOrderedIn) support.
18911922
+/
18921923
struct 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

Comments
 (0)