Search code examples
scalaprotocol-buffersscalapb

How to serialize/deserialize a protobuf message that uses 'oneof' with ScalaPB?


I'm using ScalaPB to compile my Scala case classes for serializing my protobuf messages.

I have a .proto file with the following messages:

message WrapperMessage {
    oneof msg {
        Login login = 1;
        Register register = 2;
    }
}

message Login {
    required string email = 1;
    required string password = 2;
}

message Register {
    required string email = 1;
    required string password = 2;
    optional string firstName = 3;
    optional string lastName = 4;
}

How do I create my WrapperMessage knowing that I want to put a Login message inside the msg?

  val login = Login(email = "[email protected]", password = "testpass")
  val wrapperMessage = WrapperMessage(???)
  val wrapperMessageBytes = wrapperMessage.toByteArray

Let's say now that I am receiving a WrapperMessage over the wire; how do I deserialize the message using ScalaPB case class methods?


Solution

  • ScalaPB has documentation which clearly provides examples for the questions I am asking. In this answer I tailor the examples provided on ScalaPB towards my question.

    To initialize a message with oneof:

    val login = Login(email = "[email protected]", password = "testpass")
    val wrapperMessage = WrapperMessage().withLogin(login)
    

    To match against a message's oneof field:

    wrapperMessage.msg match {
      case Msg.Login(l) =>  // handle l
      case Msg.Register(r) =>  // handle r
      case Msg.Empty =>  // handle exceptional case...
    }