Allow structs with non-marshaled non-canDBus fields (#28)
This commit is contained in:
parent
279c3ab00b
commit
99cb6cb071
|
@ -344,7 +344,8 @@ void readIterTuple(Tup)(DBusMessageIter *iter, ref Tup tuple) if(isTuple!Tup &&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void readIterStruct(S)(DBusMessageIter *iter, ref S s) if(is(S == struct) && allCanDBus!(Fields!S)) {
|
void readIterStruct(S)(DBusMessageIter *iter, ref S s) if(is(S == struct) && canDBus!S)
|
||||||
|
{
|
||||||
foreach(index, T; Fields!S) {
|
foreach(index, T; Fields!S) {
|
||||||
static if (isAllowedField!(s.tupleof[index])) {
|
static if (isAllowedField!(s.tupleof[index])) {
|
||||||
s.tupleof[index] = readIter!T(iter);
|
s.tupleof[index] = readIter!T(iter);
|
||||||
|
|
|
@ -654,6 +654,7 @@ unittest {
|
||||||
struct S2 {
|
struct S2 {
|
||||||
int h, i;
|
int h, i;
|
||||||
@(Yes.DBusMarshal) int j, k;
|
@(Yes.DBusMarshal) int j, k;
|
||||||
|
int *p;
|
||||||
}
|
}
|
||||||
|
|
||||||
@dbusMarshaling(MarshalingFlag.includePrivateFields)
|
@dbusMarshaling(MarshalingFlag.includePrivateFields)
|
||||||
|
@ -667,10 +668,12 @@ unittest {
|
||||||
|
|
||||||
Message msg = Message("org.example.wow", "/wut", "org.test.iface", "meth3");
|
Message msg = Message("org.example.wow", "/wut", "org.test.iface", "meth3");
|
||||||
|
|
||||||
|
__gshared int dummy;
|
||||||
|
|
||||||
enum testStruct = S3(
|
enum testStruct = S3(
|
||||||
variant(5), "blah",
|
variant(5), "blah",
|
||||||
S1(-7, 63.5, "test"),
|
S1(-7, 63.5, "test"),
|
||||||
S2(84, -123, 78, 432),
|
S2(84, -123, 78, 432, &dummy),
|
||||||
16
|
16
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -680,7 +683,7 @@ unittest {
|
||||||
enum expectedResult = S3(
|
enum expectedResult = S3(
|
||||||
variant(5), "blah",
|
variant(5), "blah",
|
||||||
S1(int.init, 63.5, "test"),
|
S1(int.init, 63.5, "test"),
|
||||||
S2(int.init, int.init, 78, 432),
|
S2(int.init, int.init, 78, 432, null),
|
||||||
uint.init
|
uint.init
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ template canDBus(T) {
|
||||||
} else static if(isAssociativeArray!T) {
|
} else static if(isAssociativeArray!T) {
|
||||||
enum canDBus = basicDBus!(KeyType!T) && canDBus!(ValueType!T);
|
enum canDBus = basicDBus!(KeyType!T) && canDBus!(ValueType!T);
|
||||||
} else static if(is(T == struct) && !isInstanceOf!(DictionaryEntry, T)) {
|
} else static if(is(T == struct) && !isInstanceOf!(DictionaryEntry, T)) {
|
||||||
enum canDBus = allCanDBus!(Fields!T);
|
enum canDBus = allCanDBus!(AllowedFieldTypes!T);
|
||||||
} else {
|
} else {
|
||||||
enum canDBus = false;
|
enum canDBus = false;
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ string typeSig(T)() if(canDBus!T) {
|
||||||
return "a{" ~ typeSig!(KeyType!T) ~ typeSig!(ValueType!T) ~ "}";
|
return "a{" ~ typeSig!(KeyType!T) ~ typeSig!(ValueType!T) ~ "}";
|
||||||
} else static if(is(T == struct)) {
|
} else static if(is(T == struct)) {
|
||||||
string sig = "(";
|
string sig = "(";
|
||||||
foreach(i, S; Fields!T) {
|
foreach(i, S; AllowedFieldTypes!T) {
|
||||||
sig ~= typeSig!S();
|
sig ~= typeSig!S();
|
||||||
}
|
}
|
||||||
sig ~= ")";
|
sig ~= ")";
|
||||||
|
@ -241,3 +241,11 @@ unittest {
|
||||||
sig3.assertEqual("iss");
|
sig3.assertEqual("iss");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private template AllowedFieldTypes(S) if (is(S == struct)) {
|
||||||
|
import ddbus.attributes : isAllowedField;
|
||||||
|
import std.meta : Filter, staticMap;
|
||||||
|
static alias TypeOf(alias sym) = typeof(sym);
|
||||||
|
|
||||||
|
alias AllowedFieldTypes =
|
||||||
|
staticMap!(TypeOf, Filter!(isAllowedField, S.tupleof));
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue