Skip to content

Commit

Permalink
Merge pull request #15 from lxzan/dev
Browse files Browse the repository at this point in the history
rebuild codec api
  • Loading branch information
lxzan committed Dec 5, 2023
2 parents 82e4d38 + 7be3f34 commit e59de96
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 68 deletions.
2 changes: 1 addition & 1 deletion client.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func (c *Client) Request(method string, url string, args ...any) *Request {
reuseBodyEnabled: c.config.ReuseBodyEnabled,
}

r.SetEncoder(JsonEncoder)
r.SetEncoder(JsonCodec)

return r
}
8 changes: 4 additions & 4 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ func TestRequest_Send(t *testing.T) {

t.Run("", func(t *testing.T) {
resp := Post("http://%s", addr).
SetEncoder(FormEncoder).
SetEncoder(FormCodec).
Send(nil)
assert.NoError(t, resp.Err())
})
Expand Down Expand Up @@ -350,15 +350,15 @@ func TestResponse(t *testing.T) {
t.Run("204 response", func(t *testing.T) {
resp1 := Post("http://%s/204", addr).
Debug().
SetEncoder(JsonEncoder).
SetEncoder(JsonCodec).
Send(map[string]any{
"name": "xxx",
})
assert.NotNil(t, resp1.Body)

resp2 := Post("http://%s/204", addr).
Debug().
SetEncoder(FormEncoder).
SetEncoder(FormCodec).
Send(nil)
assert.NotNil(t, resp2.Body)
})
Expand All @@ -367,7 +367,7 @@ func TestResponse(t *testing.T) {
var netConn *net.TCPConn
resp := Post("http://%s/204", addr).
Debug().
SetEncoder(FormEncoder).
SetEncoder(FormCodec).
Send(net.Conn(netConn))
assert.Error(t, resp.Err())
})
Expand Down
51 changes: 32 additions & 19 deletions codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,24 +27,35 @@ const (

type Any map[string]any

type Encoder interface {
Encode(v any) (io.Reader, error)
ContentType() string
}
type (
Codec interface {
Encoder
Decoder
}

Encoder interface {
Encode(v any) (io.Reader, error)
ContentType() string
}

Decoder interface {
Decode(r io.Reader, v any) error
}
)

var (
JsonEncoder = new(jsonEncoder)
FormEncoder = new(formEncoder)
XmlEncoder = new(xmlEncoder)
JsonCodec = new(jsonCodec)
FormCodec = new(formCodec)
XmlCodec = new(xmlCodec)
)

type (
jsonEncoder struct{}
formEncoder struct{}
xmlEncoder struct{}
jsonCodec struct{}
formCodec struct{}
xmlCodec struct{}
)

func (c jsonEncoder) Encode(v any) (io.Reader, error) {
func (c jsonCodec) Encode(v any) (io.Reader, error) {
if v == nil {
return nil, nil
}
Expand All @@ -54,13 +65,15 @@ func (c jsonEncoder) Encode(v any) (io.Reader, error) {
return r, errors.WithStack(err)
}

func (c jsonEncoder) ContentType() string {
func (c jsonCodec) ContentType() string {
return MimeJson
}

func JsonDecode(r io.Reader, v any) error { return jsoniter.ConfigFastest.NewDecoder(r).Decode(v) }
func (c jsonCodec) Decode(r io.Reader, v any) error {
return jsoniter.ConfigFastest.NewDecoder(r).Decode(v)
}

func (f formEncoder) Encode(v any) (io.Reader, error) {
func (f formCodec) Encode(v any) (io.Reader, error) {
if v == nil {
return nil, nil
}
Expand All @@ -74,11 +87,11 @@ func (f formEncoder) Encode(v any) (io.Reader, error) {
}
}

func (f formEncoder) ContentType() string {
func (f formCodec) ContentType() string {
return MimeForm
}

func FormDecode(r io.Reader, v any) error {
func (f formCodec) Decode(r io.Reader, v any) error {
values, ok := v.(*url.Values)
if !ok {
return errors.Wrap(errUnsupportedData, "v must be *url.Values type")
Expand All @@ -95,7 +108,7 @@ func FormDecode(r io.Reader, v any) error {
return nil
}

func (c xmlEncoder) Encode(v any) (io.Reader, error) {
func (c xmlCodec) Encode(v any) (io.Reader, error) {
if v == nil {
return nil, nil
}
Expand All @@ -105,11 +118,11 @@ func (c xmlEncoder) Encode(v any) (io.Reader, error) {
return r, errors.WithStack(err)
}

func (c xmlEncoder) ContentType() string {
func (c xmlCodec) ContentType() string {
return MimeXml
}

func XmlDecode(r io.Reader, v any) error {
func (c xmlCodec) Decode(r io.Reader, v any) error {
return errors.WithStack(xml.NewDecoder(r).Decode(v))
}

Expand Down
30 changes: 15 additions & 15 deletions codec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,39 +15,39 @@ import (
)

func TestForm_encoder_Encode(t *testing.T) {
_, err1 := FormEncoder.Encode(struct {
_, err1 := FormCodec.Encode(struct {
Name string
}{Name: "caster"})
assert.True(t, errors.Is(err1, errUnsupportedData))

_, err2 := FormEncoder.Encode(url.Values{
_, err2 := FormCodec.Encode(url.Values{
"name": []string{"caster"},
})
assert.NoError(t, err2)

_, err3 := FormEncoder.Encode(nil)
_, err3 := FormCodec.Encode(nil)
assert.NoError(t, err3)

var netConn *net.TCPConn
_, err4 := FormEncoder.Encode(net.Conn(netConn))
_, err4 := FormCodec.Encode(net.Conn(netConn))
assert.Error(t, err4)

_, err5 := FormEncoder.Encode("a=xxx")
_, err5 := FormCodec.Encode("a=xxx")
assert.NoError(t, err5)
}

func TestJson_encoder_Encode(t *testing.T) {
_, err1 := JsonEncoder.Encode(struct {
_, err1 := JsonCodec.Encode(struct {
Name string
}{Name: "caster"})
assert.NoError(t, err1)

_, err2 := JsonEncoder.Encode(map[string]interface{}{
_, err2 := JsonCodec.Encode(map[string]interface{}{
"name": "caster",
})
assert.NoError(t, err2)

_, err3 := JsonEncoder.Encode(nil)
_, err3 := JsonCodec.Encode(nil)
assert.NoError(t, err3)
}

Expand All @@ -72,7 +72,7 @@ func TestFormDecode(t *testing.T) {
t.Run("ok", func(t *testing.T) {
var params = url.Values{}
var text = "a=xxx&b=1"
var err = FormDecode(strings.NewReader(text), &params)
var err = FormCodec.Decode(strings.NewReader(text), &params)
assert.NoError(t, err)
assert.Equal(t, params["a"][0], "xxx")
})
Expand All @@ -92,21 +92,21 @@ func TestFormDecode(t *testing.T) {

t.Run("unsupported type", func(t *testing.T) {
var params = url.Values{}
var err = FormDecode(strings.NewReader(""), params)
var err = FormCodec.Decode(strings.NewReader(""), params)
assert.True(t, errors.Is(err, errUnsupportedData))
})

t.Run("error", func(t *testing.T) {
var params = url.Values{}
var text = "a;b;c"
var err = FormDecode(strings.NewReader(text), &params)
var err = FormCodec.Decode(strings.NewReader(text), &params)
assert.Error(t, err)
})
}

func TestXmlEncoder(t *testing.T) {
t.Run("type", func(t *testing.T) {
assert.Equal(t, XmlEncoder.ContentType(), MimeXml)
assert.Equal(t, XmlCodec.ContentType(), MimeXml)
})

t.Run("", func(t *testing.T) {
Expand All @@ -117,12 +117,12 @@ func TestXmlEncoder(t *testing.T) {
}{
Name: "cas",
}
_, err := XmlEncoder.Encode(params)
_, err := XmlCodec.Encode(params)
assert.NoError(t, err)
})

t.Run("nil", func(t *testing.T) {
_, err := XmlEncoder.Encode(nil)
_, err := XmlCodec.Encode(nil)
assert.NoError(t, err)
})
}
Expand Down Expand Up @@ -153,7 +153,7 @@ func TestXmlDecode(t *testing.T) {
}

var p = &Peoples{}
var err = XmlDecode(strings.NewReader(text), p)
var err = XmlCodec.Decode(strings.NewReader(text), p)
assert.NoError(t, err)

t.Run("bind", func(t *testing.T) {
Expand Down
11 changes: 6 additions & 5 deletions contrib/pb/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@ import (

var (
errDataType = errors.New("v must be proto.Message type")
Encoder = new(encoder)

Codec = new(codec)
)

type encoder struct{}
type codec struct{}

func (c encoder) Encode(v any) (io.Reader, error) {
func (c codec) Encode(v any) (io.Reader, error) {
if v == nil {
return nil, nil
}
Expand All @@ -31,11 +32,11 @@ func (c encoder) Encode(v any) (io.Reader, error) {
return bytes.NewReader(p), errors.WithStack(err)
}

func (c encoder) ContentType() string {
func (c codec) ContentType() string {
return hasaki.MimeProtoBuf
}

func Decode(r io.Reader, v any) error {
func (c codec) Decode(r io.Reader, v any) error {
message, ok := v.(proto.Message)
if !ok {
return errors.WithStack(errDataType)
Expand Down
20 changes: 10 additions & 10 deletions contrib/pb/codec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,23 @@ func TestEncoder_Encode(t *testing.T) {
Name: "caster",
Age: 1,
}
_, err := Encoder.Encode(req)
_, err := Codec.Encode(req)
assert.NoError(t, err)
})

t.Run("nil", func(t *testing.T) {
_, err := Encoder.Encode(nil)
_, err := Codec.Encode(nil)
assert.NoError(t, err)
})

t.Run("unexpected type", func(t *testing.T) {
_, err := Encoder.Encode(struct{}{})
_, err := Codec.Encode(struct{}{})
assert.True(t, errors.Is(err, errDataType))
})
}

func TestEncoder_ContentType(t *testing.T) {
assert.Equal(t, Encoder.ContentType(), hasaki.MimeProtoBuf)
assert.Equal(t, Codec.ContentType(), hasaki.MimeProtoBuf)
}

func TestDecode(t *testing.T) {
Expand All @@ -43,10 +43,10 @@ func TestDecode(t *testing.T) {
Name: "caster",
Age: 1,
}
r, _ := Encoder.Encode(req)
r, _ := Codec.Encode(req)

var res = &internal.HelloRequest{}
var err = Decode(r, res)
var err = Codec.Decode(r, res)
assert.NoError(t, err)
assert.Equal(t, req.Name, res.Name)
})
Expand All @@ -56,12 +56,12 @@ func TestDecode(t *testing.T) {
Name: "caster",
Age: 1,
}
r, _ := Encoder.Encode(req)
r, _ := Codec.Encode(req)
p, _ := io.ReadAll(r)
br := &internal2.CloserWrapper{B: &bytebufferpool.ByteBuffer{B: p}, R: bytes.NewReader(p)}

var res = &internal.HelloRequest{}
var err = Decode(br, res)
var err = Codec.Decode(br, res)
assert.NoError(t, err)
assert.Equal(t, req.Name, res.Name)
})
Expand All @@ -71,13 +71,13 @@ func TestDecode(t *testing.T) {
Name: "caster",
Age: 1,
}
r, _ := Encoder.Encode(req)
r, _ := Codec.Encode(req)

var res = struct {
Name string
Age int
}{}
var err = Decode(r, &res)
var err = Codec.Decode(r, &res)
assert.True(t, errors.Is(err, errDataType))
})
}
10 changes: 5 additions & 5 deletions contrib/yaml/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import (

//go:generate go mod tidy

var Encoder = new(encoder)
var Codec = new(codec)

type encoder struct{}
type codec struct{}

func (c encoder) Encode(v any) (io.Reader, error) {
func (c codec) Encode(v any) (io.Reader, error) {
if v == nil {
return nil, nil
}
Expand All @@ -26,10 +26,10 @@ func (c encoder) Encode(v any) (io.Reader, error) {
return r, errors.WithStack(err)
}

func (c encoder) ContentType() string {
func (c codec) ContentType() string {
return hasaki.MimeYaml
}

func Decode(r io.Reader, v any) error {
func (c codec) Decode(r io.Reader, v any) error {
return errors.WithStack(yaml.NewDecoder(r).Decode(v))
}
Loading

0 comments on commit e59de96

Please sign in to comment.