Skip to content

Commit b6b90c0

Browse files
committed
Add de/serializers
1 parent eef9f97 commit b6b90c0

File tree

6 files changed

+30
-45
lines changed

6 files changed

+30
-45
lines changed

body.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,21 @@ func BodyBytes(b []byte) BodyGetter {
4343
}
4444
}
4545

46-
// BodyJSON is a BodyGetter that marshals a JSON object.
47-
func BodyJSON(v any) BodyGetter {
46+
func BodySerializer(s Serializer, v any) BodyGetter {
4847
return func() (io.ReadCloser, error) {
49-
b, err := jsonMarshal(v)
48+
b, err := s(v)
5049
if err != nil {
5150
return nil, err
5251
}
5352
return rc(bytes.NewReader(b)), nil
5453
}
5554
}
5655

56+
// BodyJSON is a BodyGetter that marshals a JSON object.
57+
func BodyJSON(v any) BodyGetter {
58+
return BodySerializer(JSONSerializer, v)
59+
}
60+
5761
// BodyForm is a BodyGetter that builds an encoded form body.
5862
func BodyForm(data url.Values) BodyGetter {
5963
return func() (r io.ReadCloser, err error) {

builder_extras.go

+10
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ func (rb *Builder) BodyBytes(b []byte) *Builder {
133133
return rb.Body(BodyBytes(b))
134134
}
135135

136+
func (rb *Builder) BodySerializer(s Serializer, v any) *Builder {
137+
return rb.
138+
Body(BodySerializer(s, v))
139+
}
140+
136141
// BodyJSON sets the Builder's request body to the marshaled JSON.
137142
// It also sets ContentType to "application/json".
138143
func (rb *Builder) BodyJSON(v any) *Builder {
@@ -169,6 +174,11 @@ func (rb *Builder) CheckPeek(n int, f func([]byte) error) *Builder {
169174
return rb.AddValidator(CheckPeek(n, f))
170175
}
171176

177+
func (rb *Builder) ToDeserializer(d Deserializer, v any) *Builder {
178+
return rb.
179+
Handle(ToDeserializer(d, v))
180+
}
181+
172182
// ToJSON sets the Builder to decode a response as a JSON object
173183
func (rb *Builder) ToJSON(v any) *Builder {
174184
return rb.Handle(ToJSON(v))

handler.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,24 @@ func consumeBody(res *http.Response) (err error) {
3838
return err
3939
}
4040

41-
// ToJSON decodes a response as a JSON object.
42-
func ToJSON(v any) ResponseHandler {
41+
func ToDeserializer(d Deserializer, v any) ResponseHandler {
4342
return func(res *http.Response) error {
4443
data, err := io.ReadAll(res.Body)
4544
if err != nil {
4645
return err
4746
}
48-
if err = jsonUnmarshal(data, v); err != nil {
47+
if err = d(data, v); err != nil {
4948
return err
5049
}
5150
return nil
5251
}
5352
}
5453

54+
// ToJSON decodes a response as a JSON object.
55+
func ToJSON(v any) ResponseHandler {
56+
return ToDeserializer(JSONDeserializer, v)
57+
}
58+
5559
// ToString writes the response body to the provided string pointer.
5660
func ToString(sp *string) ResponseHandler {
5761
return func(res *http.Response) error {

json.go

+4-19
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,10 @@ import (
44
"encoding/json"
55
)
66

7-
type jsonMarshaller = func(v any) ([]byte, error)
8-
type jsonUnmarshaller = func(data []byte, v any) error
7+
type Serializer = func(v any) ([]byte, error)
8+
type Deserializer = func(data []byte, v any) error
99

1010
var (
11-
jsonMarshal = json.Marshal
12-
jsonUnmarshal = json.Unmarshal
11+
JSONSerializer = json.Marshal
12+
JSONDeserializer = json.Unmarshal
1313
)
14-
15-
func SetJSONUnmarshaller(j jsonUnmarshaller) {
16-
jsonUnmarshal = j
17-
}
18-
19-
func SetJSONMarshaller(j jsonMarshaller) {
20-
jsonMarshal = j
21-
}
22-
23-
// SetJSONSerializers is a function to set global json.Marshal/json.Unmarshal function
24-
// For faster serialization/deserialization you can use functions from, for instance, https://github.com/goccy/go-json
25-
func SetJSONSerializers(marshaller jsonMarshaller, unmarshaller jsonUnmarshaller) {
26-
jsonMarshal = marshaller
27-
jsonUnmarshal = unmarshaller
28-
}

reqxml/body.go

+1-8
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,13 @@ package reqxml
22

33
import (
44
"encoding/xml"
5-
"io"
65

76
"github.com/carlmjohnson/requests"
87
)
98

109
// Body is a BodyGetter that marshals a XML object.
1110
func Body(v any) requests.BodyGetter {
12-
return func() (io.ReadCloser, error) {
13-
b, err := xml.Marshal(v)
14-
if err != nil {
15-
return nil, err
16-
}
17-
return requests.BodyBytes(b)()
18-
}
11+
return requests.BodySerializer(xml.Marshal, v)
1912
}
2013

2114
// BodyConfig sets the Builder's request body to the marshaled XML.

reqxml/to.go

+1-12
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,11 @@ package reqxml
22

33
import (
44
"encoding/xml"
5-
"io"
6-
"net/http"
75

86
"github.com/carlmjohnson/requests"
97
)
108

119
// To decodes a response as an XML object.
1210
func To(v any) requests.ResponseHandler {
13-
return func(res *http.Response) error {
14-
data, err := io.ReadAll(res.Body)
15-
if err != nil {
16-
return err
17-
}
18-
if err = xml.Unmarshal(data, v); err != nil {
19-
return err
20-
}
21-
return nil
22-
}
11+
return requests.ToDeserializer(xml.Unmarshal, v)
2312
}

0 commit comments

Comments
 (0)