frostfs-api-go/rpc/message/message.go
Leonard Lyubich c61656a43f [#263] Define generic protobuf message
Define `Message` interface of the generic protobuf message. In the initial
implementation, the message should be convertible to and from related gRPC
message.

Implement encoding functions over the `Message` that can:

 * unmarshal the `Message` via related gRPC message;
 * decode the `Message` from JSON format via related gRPC message;
 * encode the `Message` to JSON.

Implement nested `test` package for testing the implementation.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
2021-03-17 14:03:49 +03:00

43 lines
1 KiB
Go

package message
import (
"fmt"
"github.com/nspcc-dev/neofs-api-go/rpc/grpc"
)
// Message represents raw Protobuf message
// that can be transmitted via several
// transport protocols.
type Message interface {
// Must return gRPC message that can
// be used for gRPC protocol transmission.
ToGRPCMessage() grpc.Message
// Must restore the message from related
// gRPC message.
//
// If gRPC message is not a related one,
// ErrUnexpectedMessageType can be returned
// to indicate this.
FromGRPCMessage(grpc.Message) error
}
// ErrUnexpectedMessageType is an error that
// is used to indicate message mismatch.
type ErrUnexpectedMessageType struct {
exp, act interface{}
}
// NewUnexpectedMessageType initializes an error about message mismatch
// between act and exp.
func NewUnexpectedMessageType(act, exp interface{}) ErrUnexpectedMessageType {
return ErrUnexpectedMessageType{
exp: exp,
act: act,
}
}
func (e ErrUnexpectedMessageType) Error() string {
return fmt.Sprintf("unexpected message type %T: expected %T", e.act, e.exp)
}