diff --git a/capnp/lib/capnp.pyx b/capnp/lib/capnp.pyx index ffac811..2c8158a 100644 --- a/capnp/lib/capnp.pyx +++ b/capnp/lib/capnp.pyx @@ -2050,7 +2050,7 @@ cdef class _DynamicCapabilityClient: return _find_field_order(params.struct) cdef _set_fields(self, Request * request, name, args, kwargs): - if args is not None: + if args is not None and len(args) > 0: arg_names = self._find_method_args(name) if len(args) > len(arg_names): raise KjException('Too many arguments passed to `%s`. Expected %d and got %d' % (name, len(arg_names), len(args))) diff --git a/test/test_capability.capnp b/test/test_capability.capnp index 5d3c140..816fdf3 100644 --- a/test/test_capability.capnp +++ b/test/test_capability.capnp @@ -81,3 +81,11 @@ interface TestTailCaller { interface TestPassedCap { foo @0 (cap :TestInterface) -> (x: Text); } + +interface TestStructArg { + bar @0 BarParams -> (c: Text); +} +struct BarParams { + a @0 :Text; + b @1 :Int32; +} diff --git a/test/test_capability.py b/test/test_capability.py index 61b7906..1667d7d 100644 --- a/test/test_capability.py +++ b/test/test_capability.py @@ -358,3 +358,15 @@ def test_null_cap(): with pytest.raises(capnp.KjException): client.foo().wait() + + +class TestStructArg(capability.TestStructArg.Server): + def bar(self, a, b, **kwargs): + return a + str(b) + + +def test_struct_args(): + client = capability.TestStructArg._new_client(TestStructArg()) + assert client.bar(a='test', b=1).wait().c == 'test1' + with pytest.raises(capnp.KjException): + assert client.bar('test', 1).wait().c == 'test1'