Allow structs with non-marshaled non-canDBus fields (#28)

This commit is contained in:
thaven 2017-11-04 15:12:56 +01:00 committed by GitHub
parent 279c3ab00b
commit 99cb6cb071
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 5 deletions

View file

@ -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) {
static if (isAllowedField!(s.tupleof[index])) {
s.tupleof[index] = readIter!T(iter);

View file

@ -654,6 +654,7 @@ unittest {
struct S2 {
int h, i;
@(Yes.DBusMarshal) int j, k;
int *p;
}
@dbusMarshaling(MarshalingFlag.includePrivateFields)
@ -667,10 +668,12 @@ unittest {
Message msg = Message("org.example.wow", "/wut", "org.test.iface", "meth3");
__gshared int dummy;
enum testStruct = S3(
variant(5), "blah",
S1(-7, 63.5, "test"),
S2(84, -123, 78, 432),
S2(84, -123, 78, 432, &dummy),
16
);
@ -680,7 +683,7 @@ unittest {
enum expectedResult = S3(
variant(5), "blah",
S1(int.init, 63.5, "test"),
S2(int.init, int.init, 78, 432),
S2(int.init, int.init, 78, 432, null),
uint.init
);

View file

@ -86,7 +86,7 @@ template canDBus(T) {
} else static if(isAssociativeArray!T) {
enum canDBus = basicDBus!(KeyType!T) && canDBus!(ValueType!T);
} else static if(is(T == struct) && !isInstanceOf!(DictionaryEntry, T)) {
enum canDBus = allCanDBus!(Fields!T);
enum canDBus = allCanDBus!(AllowedFieldTypes!T);
} else {
enum canDBus = false;
}
@ -147,7 +147,7 @@ string typeSig(T)() if(canDBus!T) {
return "a{" ~ typeSig!(KeyType!T) ~ typeSig!(ValueType!T) ~ "}";
} else static if(is(T == struct)) {
string sig = "(";
foreach(i, S; Fields!T) {
foreach(i, S; AllowedFieldTypes!T) {
sig ~= typeSig!S();
}
sig ~= ")";
@ -241,3 +241,11 @@ unittest {
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));
}