Handle AnyPointers better as arguments to RPC functions
This commit is contained in:
@@ -427,6 +427,7 @@ cdef extern from "capnp/dynamic.h" namespace " ::capnp":
|
|||||||
Reader(DynamicStruct.Reader& value)
|
Reader(DynamicStruct.Reader& value)
|
||||||
Reader(DynamicCapability.Client& value)
|
Reader(DynamicCapability.Client& value)
|
||||||
Reader(PythonInterfaceDynamicImpl& value)
|
Reader(PythonInterfaceDynamicImpl& value)
|
||||||
|
Reader(AnyPointer.Reader& value)
|
||||||
Type getType()
|
Type getType()
|
||||||
int64_t asInt"as<int64_t>"()
|
int64_t asInt"as<int64_t>"()
|
||||||
uint64_t asUint"as<uint64_t>"()
|
uint64_t asUint"as<uint64_t>"()
|
||||||
|
|||||||
@@ -661,6 +661,12 @@ cdef C_DynamicValue.Reader _extract_dynamic_server(object value):
|
|||||||
cdef C_DynamicValue.Reader _extract_dynamic_enum(_DynamicEnum value):
|
cdef C_DynamicValue.Reader _extract_dynamic_enum(_DynamicEnum value):
|
||||||
return C_DynamicValue.Reader(value.thisptr)
|
return C_DynamicValue.Reader(value.thisptr)
|
||||||
|
|
||||||
|
cdef C_DynamicValue.Reader _extract_any_pointer(_DynamicObjectReader value):
|
||||||
|
return C_DynamicValue.Reader(value.thisptr)
|
||||||
|
|
||||||
|
cdef C_DynamicValue.Reader _extract_any_pointer_builder(_DynamicObjectBuilder value):
|
||||||
|
return C_DynamicValue.Reader(value.thisptr.asReader())
|
||||||
|
|
||||||
cdef _setBytes(_DynamicSetterClasses thisptr, field, value):
|
cdef _setBytes(_DynamicSetterClasses thisptr, field, value):
|
||||||
cdef capnp.StringPtr temp_string = capnp.StringPtr(<char*>value, len(value))
|
cdef capnp.StringPtr temp_string = capnp.StringPtr(<char*>value, len(value))
|
||||||
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(temp_string)
|
cdef C_DynamicValue.Reader temp = C_DynamicValue.Reader(temp_string)
|
||||||
@@ -726,6 +732,10 @@ cdef _setDynamicField(_DynamicSetterClasses thisptr, field, value, parent):
|
|||||||
thisptr.set(field, _extract_dynamic_server(value))
|
thisptr.set(field, _extract_dynamic_server(value))
|
||||||
elif value_type is _DynamicEnum:
|
elif value_type is _DynamicEnum:
|
||||||
thisptr.set(field, _extract_dynamic_enum(value))
|
thisptr.set(field, _extract_dynamic_enum(value))
|
||||||
|
elif value_type is _DynamicObjectReader:
|
||||||
|
thisptr.set(field, _extract_any_pointer(value))
|
||||||
|
elif value_type is _DynamicObjectBuilder:
|
||||||
|
thisptr.set(field, _extract_any_pointer_builder(value))
|
||||||
else:
|
else:
|
||||||
raise KjException("Tried to set field: '{}' with a value of: '{}' which is an unsupported type: '{}'".format(field, str(value), str(type(value))))
|
raise KjException("Tried to set field: '{}' with a value of: '{}' which is an unsupported type: '{}'".format(field, str(value), str(type(value))))
|
||||||
|
|
||||||
@@ -768,6 +778,10 @@ cdef _setDynamicFieldWithField(DynamicStruct_Builder thisptr, _StructSchemaField
|
|||||||
thisptr.setByField(field.thisptr, _extract_dynamic_server(value))
|
thisptr.setByField(field.thisptr, _extract_dynamic_server(value))
|
||||||
elif value_type is _DynamicEnum:
|
elif value_type is _DynamicEnum:
|
||||||
thisptr.setByField(field.thisptr, _extract_dynamic_enum(value))
|
thisptr.setByField(field.thisptr, _extract_dynamic_enum(value))
|
||||||
|
elif value_type is _DynamicObjectReader:
|
||||||
|
thisptr.set(field, _extract_any_pointer(value))
|
||||||
|
elif value_type is _DynamicObjectBuilder:
|
||||||
|
thisptr.set(field, _extract_any_pointer_builder(value))
|
||||||
else:
|
else:
|
||||||
raise KjException("Tried to set field: '{}' with a value of: '{}' which is an unsupported type: '{}'".format(field, str(value), str(type(value))))
|
raise KjException("Tried to set field: '{}' with a value of: '{}' which is an unsupported type: '{}'".format(field, str(value), str(type(value))))
|
||||||
|
|
||||||
@@ -810,6 +824,10 @@ cdef _setDynamicFieldStatic(DynamicStruct_Builder thisptr, field, value, parent)
|
|||||||
thisptr.set(field, _extract_dynamic_server(value))
|
thisptr.set(field, _extract_dynamic_server(value))
|
||||||
elif value_type is _DynamicEnum:
|
elif value_type is _DynamicEnum:
|
||||||
thisptr.set(field, _extract_dynamic_enum(value))
|
thisptr.set(field, _extract_dynamic_enum(value))
|
||||||
|
elif value_type is _DynamicObjectReader:
|
||||||
|
thisptr.set(field, _extract_any_pointer(value))
|
||||||
|
elif value_type is _DynamicObjectBuilder:
|
||||||
|
thisptr.set(field, _extract_any_pointer_builder(value))
|
||||||
else:
|
else:
|
||||||
raise KjException("Tried to set field: '{}' with a value of: '{}' which is an unsupported type: '{}'".format(field, str(value), str(type(value))))
|
raise KjException("Tried to set field: '{}' with a value of: '{}' which is an unsupported type: '{}'".format(field, str(value), str(type(value))))
|
||||||
|
|
||||||
|
|||||||
@@ -89,3 +89,7 @@ struct BarParams {
|
|||||||
a @0 :Text;
|
a @0 :Text;
|
||||||
b @1 :Int32;
|
b @1 :Int32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface TestGeneric(MyObject) {
|
||||||
|
foo @0 (a :MyObject) -> (b: Text);
|
||||||
|
}
|
||||||
|
|||||||
@@ -370,3 +370,16 @@ def test_struct_args():
|
|||||||
assert client.bar(a='test', b=1).wait().c == 'test1'
|
assert client.bar(a='test', b=1).wait().c == 'test1'
|
||||||
with pytest.raises(capnp.KjException):
|
with pytest.raises(capnp.KjException):
|
||||||
assert client.bar('test', 1).wait().c == 'test1'
|
assert client.bar('test', 1).wait().c == 'test1'
|
||||||
|
|
||||||
|
|
||||||
|
class TestGeneric(capability.TestGeneric.Server):
|
||||||
|
def foo(self, a, **kwargs):
|
||||||
|
return a.as_text() + 'test'
|
||||||
|
|
||||||
|
|
||||||
|
def test_generic():
|
||||||
|
client = capability.TestGeneric._new_client(TestGeneric())
|
||||||
|
|
||||||
|
obj = capnp._MallocMessageBuilder().get_root_as_any()
|
||||||
|
obj.set_as_text("anypointer_")
|
||||||
|
assert client.foo(obj).wait().b == 'anypointer_test'
|
||||||
|
|||||||
Reference in New Issue
Block a user