codec: add ability to pass codec options
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
parent
6ca851401d
commit
56e02ec463
@ -41,11 +41,11 @@ type MessageType int
|
|||||||
// connection. ReadBody may be called with a nil argument to force the
|
// connection. ReadBody may be called with a nil argument to force the
|
||||||
// body to be read and discarded.
|
// body to be read and discarded.
|
||||||
type Codec interface {
|
type Codec interface {
|
||||||
ReadHeader(io.Reader, *Message, MessageType) error
|
ReadHeader(r io.Reader, m *Message, mt MessageType) error
|
||||||
ReadBody(io.Reader, interface{}) error
|
ReadBody(r io.Reader, v interface{}) error
|
||||||
Write(io.Writer, *Message, interface{}) error
|
Write(w io.Writer, m *Message, v interface{}) error
|
||||||
Marshal(interface{}) ([]byte, error)
|
Marshal(v interface{}, opts ...Option) ([]byte, error)
|
||||||
Unmarshal([]byte, interface{}) error
|
Unmarshal(b []byte, v interface{}, opts ...Option) error
|
||||||
String() string
|
String() string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,9 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
type noopCodec struct{}
|
type noopCodec struct {
|
||||||
|
opts Options
|
||||||
|
}
|
||||||
|
|
||||||
func (c *noopCodec) ReadHeader(conn io.Reader, m *Message, t MessageType) error {
|
func (c *noopCodec) ReadHeader(conn io.Reader, m *Message, t MessageType) error {
|
||||||
return nil
|
return nil
|
||||||
@ -69,11 +71,11 @@ func (c *noopCodec) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewCodec returns new noop codec
|
// NewCodec returns new noop codec
|
||||||
func NewCodec() Codec {
|
func NewCodec(opts ...Option) Codec {
|
||||||
return &noopCodec{}
|
return &noopCodec{opts: NewOptions(opts...)}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *noopCodec) Marshal(v interface{}) ([]byte, error) {
|
func (c *noopCodec) Marshal(v interface{}, opts ...Option) ([]byte, error) {
|
||||||
if v == nil {
|
if v == nil {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
@ -96,7 +98,7 @@ func (c *noopCodec) Marshal(v interface{}) ([]byte, error) {
|
|||||||
return json.Marshal(v)
|
return json.Marshal(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *noopCodec) Unmarshal(d []byte, v interface{}) error {
|
func (c *noopCodec) Unmarshal(d []byte, v interface{}, opts ...Option) error {
|
||||||
if v == nil {
|
if v == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package codec
|
package codec
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/unistack-org/micro/v3/logger"
|
"github.com/unistack-org/micro/v3/logger"
|
||||||
"github.com/unistack-org/micro/v3/meter"
|
"github.com/unistack-org/micro/v3/meter"
|
||||||
"github.com/unistack-org/micro/v3/tracer"
|
"github.com/unistack-org/micro/v3/tracer"
|
||||||
@ -19,6 +21,10 @@ type Options struct {
|
|||||||
Tracer tracer.Tracer
|
Tracer tracer.Tracer
|
||||||
// MaxMsgSize specifies max messages size that reads by codec
|
// MaxMsgSize specifies max messages size that reads by codec
|
||||||
MaxMsgSize int
|
MaxMsgSize int
|
||||||
|
// TagName specifies tag name in struct to control codec
|
||||||
|
TagName string
|
||||||
|
// Context stores additional codec options
|
||||||
|
Context context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
// MaxMsgSize sets the max message size
|
// MaxMsgSize sets the max message size
|
||||||
@ -28,6 +34,13 @@ func MaxMsgSize(n int) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TagName sets the codec tag name in struct
|
||||||
|
func TagName(n string) Option {
|
||||||
|
return func(o *Options) {
|
||||||
|
o.TagName = n
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Logger sets the logger
|
// Logger sets the logger
|
||||||
func Logger(l logger.Logger) Option {
|
func Logger(l logger.Logger) Option {
|
||||||
return func(o *Options) {
|
return func(o *Options) {
|
||||||
@ -52,10 +65,12 @@ func Meter(m meter.Meter) Option {
|
|||||||
// NewOptions returns new options
|
// NewOptions returns new options
|
||||||
func NewOptions(opts ...Option) Options {
|
func NewOptions(opts ...Option) Options {
|
||||||
options := Options{
|
options := Options{
|
||||||
|
Context: context.Background(),
|
||||||
Logger: logger.DefaultLogger,
|
Logger: logger.DefaultLogger,
|
||||||
Meter: meter.DefaultMeter,
|
Meter: meter.DefaultMeter,
|
||||||
Tracer: tracer.DefaultTracer,
|
Tracer: tracer.DefaultTracer,
|
||||||
MaxMsgSize: DefaultMaxMsgSize,
|
MaxMsgSize: DefaultMaxMsgSize,
|
||||||
|
TagName: DefaultTagName,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
|
Loading…
Reference in New Issue
Block a user