- buf := new(bytes.Buffer)
-
- // encode message header
- var header interface{}
- if msg.GetMessageType() == api.RequestMessage {
- header = &VppRequestHeader{VlMsgID: msgID}
- } else if msg.GetMessageType() == api.ReplyMessage {
- header = &VppReplyHeader{VlMsgID: msgID}
- } else if msg.GetMessageType() == api.EventMessage {
- header = &VppEventHeader{VlMsgID: msgID}
- } else {
- header = &VppOtherHeader{VlMsgID: msgID}
- }
- err := struc.Pack(buf, header)
- if err != nil {
- return nil, fmt.Errorf("unable to encode message: header: %v, error %v", header, err)
+ // try to recover panic which might possibly occur
+ defer func() {
+ if r := recover(); r != nil {
+ var ok bool
+ if err, ok = r.(error); !ok {
+ err = fmt.Errorf("%v", r)
+ }
+ err = fmt.Errorf("panic occurred during encoding message %s: %v", msg.GetMessageName(), err)
+ }
+ }()
+
+ marshaller, ok := msg.(Marshaler)
+ if !ok {
+ marshaller = Wrapper{msg}