Hi,
Related to this, I tried the following schema:

interface MyType {
  getName @0 () -> (name :Text);
}
struct ObjectInfo {
  object @0 :MyType;
  isA    @1 :Bool;
}
interface Test {
  getObjectInfo @0 () -> (objectInfo: ObjectInfo);
}

After generating the C++ classes, on the client side, there is a 
getObject() method implemented on the ObjectInfo class but no getIsA(). 

auto request = testClient.getObjectInfoRequest();
auto promise = request.send();
auto objectInfo = promise.getObjectInfo();
auto object = objectInfo.getObject();
bool isA = objectInfo.getIsA(); //not implemented

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.

Reply via email to