Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to support custom options with protobuf-net?

I use protobuf-net and ProtoGen.exe to parse following .proto file (given by another project)

enum RGBFlags { FLAG_RED = 1; FLAG_GREEN = 2; FLAG_BLUE = 4; }

message SomeMessage {
  // Values from RGBFlags only allowed
  optional int32 flags = 2;
}   

My fellow programmers in C++ don't care about type safety and treat flags field as a plain integer. I wanted to be more strict and try to avoid such code:

SomeMessage foo = new SomeMessage();
foo.flags = (int)RGBFlags.FLAG_BLUE | (int)RGBFlags.FLAG_GREEN;

I thought that I could use protbuf custom options to amend proto code and modify XSLT transform of ProtoGet to generate necessary `[Flags]' annotations.

extend google.protobuf.EnumOptions {
  optional bool generate_bit_field = 60000;
}

enum RGBFlags {
  option (generate_bit_field) = true;
  FLAG_RED = 1; FLAG_GREEN = 2; FLAG_BLUE = 4;
}

message SomeMessage {
  // Values from RGBFlags only allowed
  optional int32 flags = 2;
}   

Problem is that all custom options appear as uninterpreted_option in the temporary file in ProtoGen.

Any idea what I could do to get [Flags] annotations in my code?

like image 444
Michal Sznajder Avatar asked Nov 20 '25 18:11

Michal Sznajder


1 Answers

Re flags; the raw protobuf spec doesn't really have support for composite enum values, so in some ways I understand why they are doing it that way. And sadly there is no such this as partial enum, so you can't add the [Flags] in a separate code file.

Re custom options; it is an excellent question, and support for custom options has been raised before. It is definitely something I'd like to add, but relative to other features it simply isn't a massively demanded item, so (due to limited resource) it has not (yet) been investigated fully.

Therefore, I don't have a great answer for you; that feature isn't really there much right now. You could hard-code that one scenario in your xslt (for your specific types). Or wait until I get around to it (I don't have a specific timescale). Or take a peek yourself.

like image 165
Marc Gravell Avatar answered Nov 22 '25 10:11

Marc Gravell



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!