Hi Christophe, The problem is here:
On Mon, Oct 10, 2022 at 5:41 AM Christophe Alexandre < [email protected]> wrote: > auto objectInfo = promise.getObjectInfo(); > auto object = objectInfo.getObject(); > Note that you are operating on a promise here. The RPC has not actually completed yet. The `object` you have obtained here is a promised future object. You can start calling methods on it before the original call has actually completed. This is called "promise pipeline" -- or, jokingly, "time travel", on the web site. https://capnproto.org/rpc.html > bool isA = objectInfo.getIsA(); //not implemented > This part doesn't work because pipelining on a boolean value is not supported. Instead, you need to wait for the promise to complete, and then you can access the boolean value on the result: auto promise2 = promise.then([](auto response) { bool isA = response.getObjectInfo().getIsA(); }); Or, if you have a WaitScope: auto response = promise.wait(waitScope); bool isA = response.getObjectInfo().getIsA(); -Kenton > > Is it because of the Bool type ? > > Thanks ! > Christophe > > Le samedi 8 octobre 2022 à 15:26:42 UTC+2, Christophe Alexandre a écrit : > >> Thanks a lot for your very clear answer. >> >> Christophe >> >> Le vendredi 7 octobre 2022 à 22:42:04 UTC+2, [email protected] a >> écrit : >> >>> Hi Christophe, >>> >>> There is no built-in mechanism for this. Instead, you have to build this >>> into your interface. >>> >>> Note that a `Client` object can be "safely" cast to any type using >>> `client.castAs<SomeInterfaceType>()`. I say "safely" meaning: you won't >>> violate C++ memory safety by this cast, even if the server doesn't actually >>> implement the type. Instead, if you cast to the wrong type, method calls on >>> that type will fail with UNIMPLEMENTED exceptions. The exception is >>> produced on the server side; the client side does not actually know the >>> destination type so cannot predict whether the method is supported. >>> >>> To that end, one way to query the type would be to simply try to call a >>> method on `ConcreteA` or `ConcreteB` and see if it fails with >>> `exception.getType() == kj::Exception::Type::UNIMPLEMENTED`. >>> >>> But if you'd like to avoid the round trip, then I would suggest that >>> `getAbstracts()` should return a list that contains not just the interface >>> pointers, but also associated metadata identifying what type it is. >>> >>> -Kenton >>> >>> On Fri, Oct 7, 2022 at 5:05 AM Christophe Alexandre < >>> [email protected]> wrote: >>> >>>> Hi, >>>> Sorry for the newbie question. >>>> >>>> I've read the following thread and this is related to the same kind of >>>> question. >>>> https://groups.google.com/g/capnproto/c/XLo5RPLpVBg/m/LI_sGi72AgAJ >>>> >>>> With following schema example: >>>> interface Abstract {} >>>> interface ConcreteA extends(Abstract) {} >>>> interface ConcreteB extends(Abstract) {} >>>> interface Object { >>>> getAbstracts @0 () -> (abstracts :List(Abstract)); >>>> } >>>> >>>> When implementing getAbstracts on the server side, only ConcreteA or >>>> ConcreteB objects are constructed and returned. >>>> My question is: on the client side, what is the best practice for >>>> determining the Abstract object concrete type and casting it to ConcreteA >>>> or ConcreteB. Something equivalent to C++ dynamic_cast. >>>> >>>> Thanks ! >>>> Christophe Alexandre >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Cap'n Proto" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/capnproto/1613eaaf-6025-4eb0-90c3-a7f4a98a2e21n%40googlegroups.com >>>> <https://groups.google.com/d/msgid/capnproto/1613eaaf-6025-4eb0-90c3-a7f4a98a2e21n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- > You received this message because you are subscribed to the Google Groups > "Cap'n Proto" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/capnproto/76ba9ec6-578f-443f-8ef3-75e66ab3e86an%40googlegroups.com > <https://groups.google.com/d/msgid/capnproto/76ba9ec6-578f-443f-8ef3-75e66ab3e86an%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "Cap'n Proto" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/capnproto/CAJouXQ%3DV-4mDXr9P5f-WHZHsQ-F7u19QSJTSdTsZW_CYuzu0xA%40mail.gmail.com.
