capnproto / capnpc-rust

Cap'n Proto code generation for Rust
76 stars 26 forks source link

Trying to return a union - Help needed #46

Open asafyish opened 6 years ago

asafyish commented 6 years ago

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.

dwrensha commented 6 years ago

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?),
  }
}