Try this on for size. Additionally when making this I noticed a few quirks in the protocol: VARINT available at wire level, not in definitions, ENUMs capped a 2^31-1, VARINT at wire level, Field numbers capped at 2048? VARINT at wire level. These seem like imlementation limitations. The uint64s below should probably be a new VARINT type.
FUCK THE LAMENESS FILTER:
message Proto { optional string package = 1; repeated string import = 2; repeated Proto imported = 3; repeated Message message = 5; repeated Extension extension = 6; repeated Enumerator enumerator = 7; repeated Option option = 8; repeated Service service = 9; } message Message { required string name = 1; repeated ScalarField scalar_field = 2; repeated EnumeratedField enumerated_field = 3; repeared MessageField message_field = 4; repeated Message message = 5; repeated Extension extension = 6; repeated Enumerator enumerator = 7; optional ExtensionRange extension_range = 16; } enum ScalarType { DOUBLE = 0; FLOAT = 1; INT32 = 2; INT64 = 3; UINT32 = 4; UINT64 = 5; SINT32 = 6; SINT64 = 7; FIXED32 = 8; FIXED64 = 9; SFIXED32 = 10; SFIXED64 = 11; BOOL = 12; STRING = 13; BYTES = 14; } enum FieldRule { REQUIRED = 0; OPTIONAL = 1; REPEATED = 2; } message ScalarField { required string name = 1; required ScalarType type = 2; optional FieldRule field_rule = 3; optional uint64 field_number = 4; optional string default = 5; } message EnumeratedField { required string name = 1; required string enumerator = 2; optional FieldRule field_rule = 3; optional uint64 field_number = 4; optional string default = 5; } message Enumerator { required string name = 1; repeated EnumeratorConstant constant = 2; } message EnumeratorConstant { required string name = 1; required uint64 value = 2; } message MessageField { required string name = 1; required string message = 2; optional FieldRule field_rule = 3; optional uint64 field_number = 4; optional string default = 5; } message ExtensionRange { required uint64 min = 1; optional uint64 max = 1; } message Extension { required Message extension = 1; } message Service { required string name = 1; repeated RPC rpc = 2; } message RPC { required string name = 1; optional string takes = 2; optional string returns = 3; } message Option { required string name = 1; optional string value = 2; }
New York... when civilization falls apart, remember, we were way ahead of you. - David Letterman