Merge branch 'master' of git://github.com/philpearl/easyjson into philpearl-master

This commit is contained in:
Alexandr Mayorskiy
2020-04-12 18:10:39 +03:00
3 changed files with 65 additions and 0 deletions
+19
View File
@@ -5,6 +5,7 @@ import (
"io"
"io/ioutil"
"net/http"
"reflect"
"strconv"
"github.com/mailru/easyjson/jlexer"
@@ -36,10 +37,18 @@ type UnknownsMarshaler interface {
MarshalUnknowns(w *jwriter.Writer, first bool)
}
func isNilInterface(i interface{}) bool {
v := reflect.ValueOf(i)
return v.Kind() == reflect.Ptr && v.IsNil()
}
// Marshal returns data as a single byte slice. Method is suboptimal as the data is likely to be copied
// from a chain of smaller chunks.
func Marshal(v Marshaler) ([]byte, error) {
w := jwriter.Writer{}
if isNilInterface(v) {
return nullBytes, nil
}
v.MarshalEasyJSON(&w)
return w.BuildBytes()
}
@@ -47,6 +56,9 @@ func Marshal(v Marshaler) ([]byte, error) {
// MarshalToWriter marshals the data to an io.Writer.
func MarshalToWriter(v Marshaler, w io.Writer) (written int, err error) {
jw := jwriter.Writer{}
if isNilInterface(v) {
return w.Write(nullBytes)
}
v.MarshalEasyJSON(&jw)
return jw.DumpTo(w)
}
@@ -57,6 +69,13 @@ func MarshalToWriter(v Marshaler, w io.Writer) (written int, err error) {
// invoked (in this case a 500 reply is possible).
func MarshalToHTTPResponseWriter(v Marshaler, w http.ResponseWriter) (started bool, written int, err error) {
jw := jwriter.Writer{}
if isNilInterface(v) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Content-Length", strconv.Itoa(len(nullBytes)))
written, err = w.Write(nullBytes)
return true, written, err
}
v.MarshalEasyJSON(&jw)
if jw.Error != nil {
return false, 0, jw.Error
+12
View File
@@ -0,0 +1,12 @@
package easyjson
import "testing"
func BenchmarkNilCheck(b *testing.B) {
var a *int
for i := 0; i < b.N; i++ {
if !isNilInterface(a) {
b.Fatal("expected it to be nil")
}
}
}
+34
View File
@@ -1,6 +1,8 @@
package tests
import (
"bytes"
"net/http/httptest"
"reflect"
"testing"
@@ -267,3 +269,35 @@ func TestMethodsNoGenerated(t *testing.T) {
}
}
}
func TestNil(t *testing.T) {
var p *PrimitiveTypes
data, err := easyjson.Marshal(p)
if err != nil {
t.Errorf("easyjson.Marshal() error: %v", err)
}
if string(data) != "null" {
t.Errorf("Wanted null, got %q", string(data))
}
var b bytes.Buffer
if n, err := easyjson.MarshalToWriter(p, &b); err != nil || n != 4 {
t.Errorf("easyjson.MarshalToWriter() error: %v, written %d", err, n)
}
if s := b.String(); s != "null" {
t.Errorf("Wanted null, got %q", s)
}
w := httptest.NewRecorder()
started, written, err := easyjson.MarshalToHTTPResponseWriter(p, w)
if !started || written != 4 || err != nil {
t.Errorf("easyjson.MarshalToHTTPResponseWriter() error: %v, written %d, started %t",
err, written, started)
}
if s := w.Body.String(); s != "null" {
t.Errorf("Wanted null, got %q", s)
}
}