An implementation of the `HasTypeId` trait will be generated for `text_node::Client`. https://github.com/capnproto/capnproto-rust/blob/eddcc1ea8599be0ae62209509ae48e1e99ee00d8/capnp/src/traits.rs#L103-L105
You should be able to get the type ID by doing `<text:node::Client as HasTypeID>::type_id()`. On Sun, May 26, 2019 at 1:56 PM Kenton Varda <[email protected]> wrote: > +David Renshaw <[email protected]> who wrote the Rust implementation, > maybe he can answer? > > On Sun, May 26, 2019 at 8:58 AM <[email protected]> wrote: > >> So I had a chance to set down with this again, and I can not for the life >> of me figure out how to get the typeId of a capability using the rust >> generator. Since I'm new to the language I presume I'm just doing something >> fundamentally wrong. Can you provide any guidance? >> >> On Saturday, May 11, 2019 at 2:09:11 PM UTC-3, Kenton Varda wrote: >>> >>> Hi Alex, >>> >>> (You didn't say which language you're using so I'll assume C++, but >>> roughly the same should apply in other languages.) >>> >>> You don't need AnyPointer here. Cap'n Proto supports upcasting and >>> downcasting capabilities, as any inheritance heirarchy should. E.g. a >>> TextNode::Client can implicitly cast to Node::Client. Downcasting is >>> explicit: if you have a `Node::Client`, you can call >>> `cilent.castAs<TextNode>()` to get a `TextNode::Client`. >>> >>> However, `castAs` doesn't actually verify the remote type. If you then >>> call a `TextNode`-specific method, and the remote object doesn't actually >>> implement `TextNode`, then you'll get an "unimplemented" exception back. >>> >>> So, you probably want some way to determine the type without calling >>> methods to find out if they throw. How to do that is really up to you. One >>> option would be to have a big enum. Another would be to use type ID's -- >>> e.g. you can do `capnp::typeId<TextNode>()` to get the `uint64_t` type ID >>> for TextNode. (Note `typeId<T>()` is a constant expression -- you can use >>> it in in a switch case.) >>> >>> So you can have a method like: >>> >>> getType @0 () -> (id :UInt64); >>> >>> Things get more complicated, of course, if you have a multi-level >>> hierarchy, e.g. Node -> Button -> RadioButton. Now you need to send around >>> a list of types. >>> >>> getTypes @0 () -> (ids :List(UInt64)); >>> >>> To avoid incurring a round trip to get the type, you might try to pass >>> the type (or list of types) along with the capabilities, like: >>> >>> interface Node { >>> children @0 () -> (list :List(TypedNode)); >>> } >>> struct TypedNode { >>> node @0 :Node; >>> type @1 :UInt64; >>> } >>> >>> Cap'n Proto does not have any built-in way of communicating the type >>> because in the vast majority of use cases, it either isn't needed at all, >>> or there is a use-case-specific solution that is cheaper/better than the >>> general solution. >>> >>> -Kenton >>> >>> On Sat, May 11, 2019 at 9:44 AM <[email protected]> wrote: >>> >>>> I'm new to statically typed languages in general, I'm doing this as a >>>> learning experience. >>>> >>>> I'm building a toy UI toolkit, and I want to create a tree of widgets. >>>> Something like >>>> >>>> interface Node { >>>> children @0 () -> (list :List(Node)); >>>> } >>>> >>>> interface TextNode extends(Node) { >>>> //some textNode specific stuff >>>> } >>>> >>>> My problem is that I want a node to be able to contain anything that >>>> *implements* the node interfaces, even if it's a textNode, or an >>>> SVGNode, or whatever. Is there a way to do that without resorting to using >>>> AnyPointer or registering all my sub nodes in advance? Some provision for >>>> doing structural typing? >>>> >>>> -- >>>> 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]. >>>> Visit this group at https://groups.google.com/group/capnproto. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/capnproto/04478ec6-c647-4d3f-a981-dc1bc6da6cae%40googlegroups.com >>>> <https://groups.google.com/d/msgid/capnproto/04478ec6-c647-4d3f-a981-dc1bc6da6cae%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]. >> Visit this group at https://groups.google.com/group/capnproto. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/capnproto/c2a716b3-bd13-4070-8862-69042aa92585%40googlegroups.com >> <https://groups.google.com/d/msgid/capnproto/c2a716b3-bd13-4070-8862-69042aa92585%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]. Visit this group at https://groups.google.com/group/capnproto. To view this discussion on the web visit https://groups.google.com/d/msgid/capnproto/CABR6rW_TEmjcYbViRsDp%2Bdr0w4zkKEXMjHE3s%3DvDNGC-dBXFUQ%40mail.gmail.com.
