mirror of
https://github.com/netbirdio/easyjson.git
synced 2026-05-22 18:44:42 -07:00
Merge branch 'master' of git://github.com/philpearl/easyjson into philpearl-master
This commit is contained in:
+19
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user