codec: simplify codec interface
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
parent
a305f7553f
commit
73c996e308
@ -3,17 +3,6 @@ package codec // import "go.unistack.org/micro/v3/codec"
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"io"
|
|
||||||
|
|
||||||
"go.unistack.org/micro/v3/metadata"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Message types
|
|
||||||
const (
|
|
||||||
Error MessageType = iota
|
|
||||||
Request
|
|
||||||
Response
|
|
||||||
Event
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -32,42 +21,13 @@ var (
|
|||||||
DefaultTagName = "codec"
|
DefaultTagName = "codec"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MessageType specifies message type for codec
|
// Codec encodes/decodes various types of messages.
|
||||||
type MessageType int
|
|
||||||
|
|
||||||
// Codec encodes/decodes various types of messages used within micro.
|
|
||||||
// ReadHeader and ReadBody are called in pairs to read requests/responses
|
|
||||||
// from the connection. Close is called when finished with the
|
|
||||||
// connection. ReadBody may be called with a nil argument to force the
|
|
||||||
// body to be read and discarded.
|
|
||||||
type Codec interface {
|
type Codec interface {
|
||||||
ReadHeader(r io.Reader, m *Message, mt MessageType) error
|
|
||||||
ReadBody(r io.Reader, v interface{}) error
|
|
||||||
Write(w io.Writer, m *Message, v interface{}) error
|
|
||||||
Marshal(v interface{}, opts ...Option) ([]byte, error)
|
Marshal(v interface{}, opts ...Option) ([]byte, error)
|
||||||
Unmarshal(b []byte, v interface{}, opts ...Option) error
|
Unmarshal(b []byte, v interface{}, opts ...Option) error
|
||||||
String() string
|
String() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Message represents detailed information about
|
|
||||||
// the communication, likely followed by the body.
|
|
||||||
// In the case of an error, body may be nil.
|
|
||||||
type Message struct {
|
|
||||||
Header metadata.Metadata
|
|
||||||
Target string
|
|
||||||
Method string
|
|
||||||
Endpoint string
|
|
||||||
Error string
|
|
||||||
ID string
|
|
||||||
Body []byte
|
|
||||||
Type MessageType
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMessage creates new codec message
|
|
||||||
func NewMessage(t MessageType) *Message {
|
|
||||||
return &Message{Type: t, Header: metadata.New(0)}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalAppend calls codec.Marshal(v) and returns the data appended to buf.
|
// MarshalAppend calls codec.Marshal(v) and returns the data appended to buf.
|
||||||
// If codec implements MarshalAppend, that is called instead.
|
// If codec implements MarshalAppend, that is called instead.
|
||||||
func MarshalAppend(buf []byte, c Codec, v interface{}, opts ...Option) ([]byte, error) {
|
func MarshalAppend(buf []byte, c Codec, v interface{}, opts ...Option) ([]byte, error) {
|
||||||
|
@ -2,70 +2,14 @@ package codec
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io"
|
|
||||||
|
codecpb "go.unistack.org/micro-proto/v3/codec"
|
||||||
)
|
)
|
||||||
|
|
||||||
type noopCodec struct {
|
type noopCodec struct {
|
||||||
opts Options
|
opts Options
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *noopCodec) ReadHeader(conn io.Reader, m *Message, t MessageType) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *noopCodec) ReadBody(conn io.Reader, b interface{}) error {
|
|
||||||
// read bytes
|
|
||||||
buf, err := io.ReadAll(conn)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if b == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
switch v := b.(type) {
|
|
||||||
case *string:
|
|
||||||
*v = string(buf)
|
|
||||||
case *[]byte:
|
|
||||||
*v = buf
|
|
||||||
case *Frame:
|
|
||||||
v.Data = buf
|
|
||||||
default:
|
|
||||||
return json.Unmarshal(buf, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *noopCodec) Write(conn io.Writer, m *Message, b interface{}) error {
|
|
||||||
if b == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var v []byte
|
|
||||||
switch vb := b.(type) {
|
|
||||||
case *Frame:
|
|
||||||
v = vb.Data
|
|
||||||
case string:
|
|
||||||
v = []byte(vb)
|
|
||||||
case *string:
|
|
||||||
v = []byte(*vb)
|
|
||||||
case *[]byte:
|
|
||||||
v = *vb
|
|
||||||
case []byte:
|
|
||||||
v = vb
|
|
||||||
default:
|
|
||||||
var err error
|
|
||||||
v, err = json.Marshal(vb)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_, err := conn.Write(v)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *noopCodec) String() string {
|
func (c *noopCodec) String() string {
|
||||||
return "noop"
|
return "noop"
|
||||||
}
|
}
|
||||||
@ -91,8 +35,8 @@ func (c *noopCodec) Marshal(v interface{}, opts ...Option) ([]byte, error) {
|
|||||||
return ve, nil
|
return ve, nil
|
||||||
case *Frame:
|
case *Frame:
|
||||||
return ve.Data, nil
|
return ve.Data, nil
|
||||||
case *Message:
|
case *codecpb.Frame:
|
||||||
return ve.Body, nil
|
return ve.Data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return json.Marshal(v)
|
return json.Marshal(v)
|
||||||
@ -115,8 +59,8 @@ func (c *noopCodec) Unmarshal(d []byte, v interface{}, opts ...Option) error {
|
|||||||
case *Frame:
|
case *Frame:
|
||||||
ve.Data = d
|
ve.Data = d
|
||||||
return nil
|
return nil
|
||||||
case *Message:
|
case *codecpb.Frame:
|
||||||
ve.Body = d
|
ve.Data = d
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -691,7 +690,7 @@ func (n *noopServer) createSubHandler(sb *subscriber, opts Options) broker.Handl
|
|||||||
req = req.Elem()
|
req = req.Elem()
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = cf.ReadBody(bytes.NewBuffer(msg.Body), req.Interface()); err != nil {
|
if err = cf.Unmarshal(msg.Body, req.Interface()); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user