+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/CAJouXQkASJyyEGu8bvFQBz0-UpWjG1tmFSbLBKaFOzE6OwEsog%40mail.gmail.com.
