-
Notifications
You must be signed in to change notification settings - Fork 665
Description
I commented in the issue #67 but I think it is necessary to open a new issue for further discussion.
I am writing a code-gen plugin to build kotlin data class for our proto file. As for oneOf case, a sealed interface may be an ideal solution.
Let's say I have a proto message like
message Person {
string name = 1;
oneof phone {
string mobile = 2;
string home = 3;
}
}
My ideal data class will be like
data class Person(
val name: String,
val phone: IPhoneType,
)
sealed interface IPhoneType
data class MobilePhone(val value: String): IPhoneType
data class HomePhone(val value: String): IPhoneTypeSo I need to tell the ProtoBuf Decoder that if it comes with ProtoNum 2 or 3, deserialize it as IPhoneType and assign to the phone field.
A custom serializer for the whole Person class can work, but it would be nice to have some additional annotation supports. Like:
data class Person(
@ProtoNum(1) val name: String,
@ProtoOneOfFields(2, 3) val phone: IPhoneType,
)
sealed interface IPhoneType
@ProtoOneOfNum(2)
data class MobilePhone(val value: String): IPhoneType
@ProtoOneOfNum(3)
data class HomePhone(val value: String): IPhoneType@ProtoOneOfFields tells that this field may be assined by the following ProtoNums, and the @ProtoOneOfNum on the concrete class tells which ProtoNum can be parsed to this type.
Generally, this case could be a flatten key for common serializer ( not ProtoBuf only ).
For example, encoding an instance of Person defined like
@Serializable
data class Person(
val name: String,
@Flatten val address: Address,
)
@Serializable
data class Address(val city: String, val street: String)is especting content (show in json) like:
{
"name": "Jhon",
"city": "London",
"street": "1st Avenue"
}And then, @ProtoOneOfFields can be a subtype of @Flatten, with more flexiable funcitons.