capnpc-rust
capnpc-rust copied to clipboard
Trying to return a union - Help needed
Hi,
I have this schema:
struct Square {
width @0 :Int64;
height @1 :Text;
}
struct Circle {
radius @0 :Int64;
}
struct Shape {
union {
square @0 :Square;
circle @1 :Circle;
}
}
I am trying to write a function that returns a mutable square or circle but don't want the caller to know about shape (not even sure it's possible in rust, because of ownership).
I tried:
pub fn get_square() -> ?? {
let mut message = capnp::message::Builder::new_default();
let mut message2 = capnp::message::Builder::new_default();
let mut shape = message2.init_root::<Shape::Builder>();
{
let square = message.init_root::<Square::Builder>();
shape.set_square(square.borrow_as_reader());
}
// How to return square ?? Is it possible ?
}
What I am trying to achieve is, having a module that expose several functions that let me create a square or circle, but without knowing about the internal parts of capnp.
I'm not sure I understand the question. Does something like the following solve your problem?
enum SquareOrCircle<'a> {
Square(Square::Builder<'a>),
Circle(Circle::Builder<'a>),
}
fn get_square<'a>(messge: &'a mut capnp::message::Builder) -> capnp::Result<SquareOrCircle<'a>> {
let mut root: Shape::Builder = message.get_root()?;
match root.which()? {
Shape::Square(square) => SquareOrCircle::Square(square?),
Shape::Circle(circl) => SquareOrCircle::Circle(circle?),
}
}