From 7be3f3498bb94670082ff03e10b9c14750f27fa9 Mon Sep 17 00:00:00 2001 From: lixizan Date: Tue, 5 Dec 2023 10:28:59 +0800 Subject: [PATCH] rebuild --- client.go | 2 +- client_test.go | 8 +++--- codec.go | 51 ++++++++++++++++++++++++-------------- codec_test.go | 30 +++++++++++----------- contrib/pb/codec.go | 11 ++++---- contrib/pb/codec_test.go | 20 +++++++-------- contrib/yaml/codec.go | 10 ++++---- contrib/yaml/codec_test.go | 8 +++--- response.go | 10 ++++---- 9 files changed, 82 insertions(+), 68 deletions(-) diff --git a/client.go b/client.go index bc080f3..e3dd134 100644 --- a/client.go +++ b/client.go @@ -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 } diff --git a/client_test.go b/client_test.go index 9e50580..4b69dab 100644 --- a/client_test.go +++ b/client_test.go @@ -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()) }) @@ -350,7 +350,7 @@ 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", }) @@ -358,7 +358,7 @@ func TestResponse(t *testing.T) { resp2 := Post("http://%s/204", addr). Debug(). - SetEncoder(FormEncoder). + SetEncoder(FormCodec). Send(nil) assert.NotNil(t, resp2.Body) }) @@ -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()) }) diff --git a/codec.go b/codec.go index 1df9bb7..8b3d72a 100644 --- a/codec.go +++ b/codec.go @@ -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 } @@ -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 } @@ -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") @@ -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 } @@ -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)) } diff --git a/codec_test.go b/codec_test.go index 3b2e64c..b03a153 100644 --- a/codec_test.go +++ b/codec_test.go @@ -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) } @@ -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), ¶ms) + var err = FormCodec.Decode(strings.NewReader(text), ¶ms) assert.NoError(t, err) assert.Equal(t, params["a"][0], "xxx") }) @@ -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), ¶ms) + var err = FormCodec.Decode(strings.NewReader(text), ¶ms) 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) { @@ -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) }) } @@ -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) { diff --git a/contrib/pb/codec.go b/contrib/pb/codec.go index 6192253..8f747e2 100644 --- a/contrib/pb/codec.go +++ b/contrib/pb/codec.go @@ -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 } @@ -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) diff --git a/contrib/pb/codec_test.go b/contrib/pb/codec_test.go index c19e6c1..2a385a4 100644 --- a/contrib/pb/codec_test.go +++ b/contrib/pb/codec_test.go @@ -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) { @@ -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) }) @@ -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) }) @@ -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)) }) } diff --git a/contrib/yaml/codec.go b/contrib/yaml/codec.go index 2608b50..4206cd6 100644 --- a/contrib/yaml/codec.go +++ b/contrib/yaml/codec.go @@ -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 } @@ -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)) } diff --git a/contrib/yaml/codec_test.go b/contrib/yaml/codec_test.go index 6959cba..1babd4f 100644 --- a/contrib/yaml/codec_test.go +++ b/contrib/yaml/codec_test.go @@ -8,7 +8,7 @@ import ( ) func TestEncoder_ContentType(t *testing.T) { - assert.Equal(t, Encoder.ContentType(), hasaki.MimeYaml) + assert.Equal(t, Codec.ContentType(), hasaki.MimeYaml) } func TestEncoder_Encode(t *testing.T) { @@ -18,12 +18,12 @@ func TestEncoder_Encode(t *testing.T) { Age int }{Name: "aha"} - _, err := Encoder.Encode(params) + _, err := Codec.Encode(params) assert.NoError(t, err) }) t.Run("nil", func(t *testing.T) { - _, err := Encoder.Encode(nil) + _, err := Codec.Encode(nil) assert.NoError(t, err) }) } @@ -41,7 +41,7 @@ user: name: "caster" age: 1 ` - var err = Decode(strings.NewReader(text), ¶ms) + var err = Codec.Decode(strings.NewReader(text), ¶ms) assert.NoError(t, err) assert.Equal(t, params.User.Name, "caster") } diff --git a/response.go b/response.go index 3049184..70460a4 100644 --- a/response.go +++ b/response.go @@ -37,20 +37,20 @@ func (c *Response) ReadBody() ([]byte, error) { return b, errors.WithStack(err) } -func (c *Response) BindJSON(v any) error { return c.Bind(v, JsonDecode) } +func (c *Response) BindJSON(v any) error { return c.Bind(v, JsonCodec) } -func (c *Response) BindXML(v any) error { return c.Bind(v, XmlDecode) } +func (c *Response) BindXML(v any) error { return c.Bind(v, XmlCodec) } -func (c *Response) BindForm(v *url.Values) error { return c.Bind(v, FormDecode) } +func (c *Response) BindForm(v *url.Values) error { return c.Bind(v, FormCodec) } -func (c *Response) Bind(v any, decode func(r io.Reader, ptr any) error) error { +func (c *Response) Bind(v any, decoder Decoder) error { if c.err != nil { return c.err } if c.Response == nil || c.Body == nil { return errors.WithStack(errEmptyResponse) } - err := decode(c.Body, v) + err := decoder.Decode(c.Body, v) _ = c.Body.Close() return errors.WithStack(err) }