|
15 | 15 | package api
|
16 | 16 |
|
17 | 17 | import (
|
| 18 | + "fmt" |
| 19 | + "reflect" |
18 | 20 | "time"
|
19 | 21 | )
|
20 | 22 |
|
@@ -115,22 +117,44 @@ type SubscriptionCtx interface {
|
115 | 117 | Unsubscribe() error
|
116 | 118 | }
|
117 | 119 |
|
118 |
| -var registeredMessages = make(map[string]Message) |
| 120 | +// CompatibilityError is the error type usually returned by CheckCompatibility |
| 121 | +// method of Channel. It describes all of the incompatible messages. |
| 122 | +type CompatibilityError struct { |
| 123 | + // IncompatibleMessages is the list of all messages |
| 124 | + // that failed compatibility check. |
| 125 | + IncompatibleMessages []string |
| 126 | +} |
| 127 | + |
| 128 | +func (c *CompatibilityError) Error() string { |
| 129 | + return fmt.Sprintf("%d incompatible messages: %v", len(c.IncompatibleMessages), c.IncompatibleMessages) |
| 130 | +} |
| 131 | + |
| 132 | +var ( |
| 133 | + registeredMessageTypes = make(map[reflect.Type]string) |
| 134 | + registeredMessages = make(map[string]Message) |
| 135 | +) |
119 | 136 |
|
120 | 137 | // RegisterMessage is called from generated code to register message.
|
121 | 138 | func RegisterMessage(x Message, name string) {
|
122 |
| - name = x.GetMessageName() + "_" + x.GetCrcString() |
123 |
| - /*if _, ok := registeredMessages[name]; ok { |
124 |
| - panic(fmt.Errorf("govpp: duplicate message registered: %s (%s)", name, x.GetCrcString())) |
125 |
| - }*/ |
126 |
| - registeredMessages[name] = x |
| 139 | + typ := reflect.TypeOf(x) |
| 140 | + namecrc := x.GetMessageName() + "_" + x.GetCrcString() |
| 141 | + if _, ok := registeredMessageTypes[typ]; ok { |
| 142 | + panic(fmt.Errorf("govpp: message type %v already registered as %s (%s)", typ, name, namecrc)) |
| 143 | + } |
| 144 | + registeredMessages[namecrc] = x |
| 145 | + registeredMessageTypes[typ] = name |
127 | 146 | }
|
128 | 147 |
|
129 | 148 | // GetRegisteredMessages returns list of all registered messages.
|
130 | 149 | func GetRegisteredMessages() map[string]Message {
|
131 | 150 | return registeredMessages
|
132 | 151 | }
|
133 | 152 |
|
| 153 | +// GetRegisteredMessageTypes returns list of all registered message types. |
| 154 | +func GetRegisteredMessageTypes() map[reflect.Type]string { |
| 155 | + return registeredMessageTypes |
| 156 | +} |
| 157 | + |
134 | 158 | // GoVppAPIPackageIsVersion1 is referenced from generated binapi files
|
135 | 159 | // to assert that that code is compatible with this version of the GoVPP api package.
|
136 | 160 | const GoVppAPIPackageIsVersion1 = true
|
0 commit comments