Skip to content

Commit

Permalink
Drop easyjson (#84)
Browse files Browse the repository at this point in the history
  • Loading branch information
ferhatelmas authored Sep 17, 2020
1 parent fc2f447 commit 8ec80ab
Show file tree
Hide file tree
Showing 14 changed files with 251 additions and 7,683 deletions.
40 changes: 19 additions & 21 deletions channel.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ import (
"net/url"
"path"
"time"

jlexer "github.com/mailru/easyjson/jlexer"
jwriter "github.com/mailru/easyjson/jwriter"
)

type ChannelRead struct {
Expand Down Expand Up @@ -52,31 +49,32 @@ type Channel struct {
UpdatedAt time.Time `json:"updated_at"`
LastMessageAt time.Time `json:"last_message_at"`

ExtraData map[string]interface{} `json:"-,extra"` //nolint: staticcheck
ExtraData map[string]interface{} `json:"-"`

client *Client
}

// UnmarshalUnknown implements the `easyjson.UnknownsUnmarshaler` interface.
func (ch *Channel) UnmarshalUnknown(in *jlexer.Lexer, key string) {
if ch.ExtraData == nil {
ch.ExtraData = make(map[string]interface{}, 1)
type channelForJSON Channel

// UnmarshalJSON implements json.Unmarshaler.
func (ch *Channel) UnmarshalJSON(data []byte) error {
var ch2 channelForJSON
if err := json.Unmarshal(data, &ch2); err != nil {
return err
}
ch.ExtraData[key] = in.Interface()
}
*ch = Channel(ch2)

// MarshalUnknowns implements the `easyjson.UnknownsMarshaler` interface.
func (ch Channel) MarshalUnknowns(out *jwriter.Writer, first bool) {
for key, val := range ch.ExtraData {
if first {
first = false
} else {
out.RawByte(',')
}
out.String(key)
out.RawByte(':')
out.Raw(json.Marshal(val))
if err := json.Unmarshal(data, &ch.ExtraData); err != nil {
return err
}

removeFromMap(ch.ExtraData, *ch)
return nil
}

// MarshalJSON implements json.Marshaler.
func (ch Channel) MarshalJSON() ([]byte, error) {
return addToMapAndMarshal(ch.ExtraData, channelForJSON(ch))
}

type queryResponse struct {
Expand Down
21 changes: 5 additions & 16 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import (
"time"

"github.com/dgrijalva/jwt-go"
"github.com/mailru/easyjson"
)

const (
Expand All @@ -43,7 +42,7 @@ func (c *Client) setHeaders(r *http.Request) {
r.Header.Set("Stream-Auth-Type", "jwt")
}

func (c *Client) parseResponse(resp *http.Response, result easyjson.Unmarshaler) error {
func (c *Client) parseResponse(resp *http.Response, result interface{}) error {
if resp.Body != nil {
defer resp.Body.Close()
}
Expand All @@ -55,7 +54,7 @@ func (c *Client) parseResponse(resp *http.Response, result easyjson.Unmarshaler)
}

if result != nil {
return easyjson.UnmarshalFromReader(resp.Body, result)
return json.NewDecoder(resp.Body).Decode(result)
}

return nil
Expand Down Expand Up @@ -94,13 +93,6 @@ func (c *Client) newRequest(method, path string, params url.Values, data interfa
case nil:
r.Body = nil

case easyjson.Marshaler:
b, err := easyjson.Marshal(t)
if err != nil {
return nil, err
}
r.Body = ioutil.NopCloser(bytes.NewReader(b))

case io.ReadCloser:
r.Body = t

Expand All @@ -118,9 +110,7 @@ func (c *Client) newRequest(method, path string, params url.Values, data interfa
return r, nil
}

func (c *Client) makeRequest(method, path string, params url.Values,
data interface{}, result easyjson.Unmarshaler) error {

func (c *Client) makeRequest(method, path string, params url.Values, data, result interface{}) error {
r, err := c.newRequest(method, path, params, data)
if err != nil {
return err
Expand Down Expand Up @@ -198,13 +188,12 @@ func (form *multipartForm) CreateFormFile(fieldName, filename, contentType strin
return form.Writer.CreatePart(h)
}

func (form *multipartForm) setData(fieldName string, data easyjson.Marshaler) error {
func (form *multipartForm) setData(fieldName string, data interface{}) error {
field, err := form.CreateFormField(fieldName)
if err != nil {
return err
}
_, err = easyjson.MarshalToWriter(data, field)
return err
return json.NewEncoder(field).Encode(data)
}

func (form *multipartForm) setFile(fieldName string, r io.Reader, fileName, contentType string) error {
Expand Down
22 changes: 22 additions & 0 deletions event.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package stream_chat // nolint: golint

import (
"encoding/json"
"errors"
"net/http"
"net/url"
Expand Down Expand Up @@ -87,6 +88,27 @@ type Event struct {
CreatedAt time.Time `json:"created_at,omitempty"`
}

type eventForJSON Event

func (e *Event) UnmarshalJSON(data []byte) error {
var e2 eventForJSON
if err := json.Unmarshal(data, &e2); err != nil {
return err
}
*e = Event(e2)

if err := json.Unmarshal(data, &e.ExtraData); err != nil {
return err
}

removeFromMap(e.ExtraData, *e)
return nil
}

func (e Event) MarshalJSON() ([]byte, error) {
return addToMapAndMarshal(e.ExtraData, eventForJSON(e))
}

type eventRequest struct {
Event *Event `json:"event"`
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/GetStream/stream-chat-go/v2
go 1.12

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/mailru/easyjson v0.7.1
github.com/stretchr/testify v1.5.1
)
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
Expand Down
41 changes: 41 additions & 0 deletions json.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package stream_chat //nolint: golint

import (
"encoding/json"
"reflect"
"strings"
)

func copyMap(m map[string]interface{}) map[string]interface{} {
m2 := make(map[string]interface{}, len(m))
for k, v := range m {
m2[k] = v
}
return m2
}

func removeFromMap(m map[string]interface{}, obj interface{}) {
t := reflect.TypeOf(obj)
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
if tag := f.Tag.Get("json"); tag != "" {
tag = strings.Split(tag, ",")[0]
delete(m, tag)
} else {
delete(m, f.Name)
}
}
}

func addToMapAndMarshal(m map[string]interface{}, obj interface{}) ([]byte, error) {
m2 := copyMap(m)

data, err := json.Marshal(obj)
if err != nil {
return nil, err
}
if err := json.Unmarshal(data, &m2); err != nil {
return nil, err
}
return json.Marshal(m2)
}
69 changes: 69 additions & 0 deletions json_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package stream_chat // nolint: golint

import (
"encoding/json"
"math/rand"
"reflect"
"testing"

"github.com/stretchr/testify/require"
)

func randomExtraData(in interface{}) {
v := reflect.ValueOf(in).Elem()
if v.Kind() != reflect.Struct {
return
}
f := v.FieldByName("ExtraData")
f.Set(reflect.ValueOf(map[string]interface{}{
"extra_data": map[string]interface{}{
"mystring": randomString(10),
"mybool": rand.Float64() < 0.5,
},
"data": "custom",
"custom_data": "really_custom",
"extra": map[string]interface{}{
randomString(10): randomString(10),
},
"stream": randomString(10),
"my_score": float64(rand.Intn(100)),
}))
}

func testInvariantJSON(t *testing.T, in, in2 interface{}) {
// put random
randomExtraData(in)

// marshal given
data, err := json.Marshal(in)
require.NoError(t, err)

// unmarshal again
require.NoError(t, json.Unmarshal(data, in2))

// ensure they are same
require.Equal(t, in, in2)
}

func TestJSON(t *testing.T) {
var c, c2 Channel
testInvariantJSON(t, &c, &c2)

var u, u2 User
testInvariantJSON(t, &u, &u2)

var e, e2 Event
testInvariantJSON(t, &e, &e2)

var m, m2 Message
testInvariantJSON(t, &m, &m2)

var mr, mr2 messageRequestMessage
testInvariantJSON(t, &mr, &mr2)

var a, a2 Attachment
testInvariantJSON(t, &a, &a2)

var r, r2 Reaction
testInvariantJSON(t, &r, &r2)
}
Loading

0 comments on commit 8ec80ab

Please sign in to comment.