Extensions to gogoprotobuf for chain.
An informational extension to be added to google.protobuf.Any
fields to indicate
which interface that field accepts. The interface name should be independent of
any programming language and either be unqualified to indicate the current package
of fully-qualified to indicate another protobuf package.
Example:
message SomeContainer {
google.protobuf.Any some_interface = 1 [(chain_proto.accepts_interface) = "SomeInterface"];
}
message AnotherContainer {
google.protobuf.Any another_interface = 1 [(chain_proto.accepts_interface) = "another.package.AnotherInterface"];
}
An informational extension to be added to messages to indicate which interface that message implements. The interface name should be independent of any programming language and either be unqualified to indicate the current package of fully-qualified to indicate another protobuf package.
message A {
option (chain_proto.implements_interface) = "SomeInterface";
int64 x = 1;
}
message B {
option (chain_proto.implements_interface) = "another.package.AnotherInterface";
double x = 1;
}
See test for a full example.
The chain_proto.interface_type
message option generates a getter and
setter from the provided go interface. Messages which use this option must
consist of a single oneof
and no other fields.
Given this example .proto
file:
message ABC {
option (chain_proto.interface_type) = "my_package.Msg";
oneof abc {
A a = 1;
B b = 2;
C c = 3;
}
}
message A { int32 x = 1; }
message B { uint32 y = 1; }
message C { bool z = 1; }
The ABC
struct will satisfy the following interface:
type MsgCodec interface {
GetMsg() Msg
SetMsg(value Msg) error
}
The types A
, B
, and C
must of course have implementations of Msg
.
By default interface_type
generates Set
handlers for both pointer and non-pointer
implementations of an interface (i.e. both *A
and A
). This means all interfaces
must be implemented for the non-pointer version of a struct. To disable the non-pointer
cases (so that just *A
and not A
needs to implement the interface), the interface
type name can be prepended with a *
, ex: option (chain_proto.interface_type) = "*my_package.Msg";
.