summaryrefslogtreecommitdiff
path: root/encode.go
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 21:48:38 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 21:48:38 -0700
commit95180a90db47990d32104ff7ab103e4862fd8426 (patch)
tree7733466fac856d93bfb6d6100fd703830a915567 /encode.go
parente9f3bdc767027d134a072e09f16bcccac75fa59f (diff)
parentddffd7b78d81f1b47b5829eb9ff0aa1887cc3b17 (diff)
Merge branch 'lukeshu/misc'
Diffstat (limited to 'encode.go')
-rw-r--r--encode.go40
1 files changed, 18 insertions, 22 deletions
diff --git a/encode.go b/encode.go
index 2d16891..b6541cd 100644
--- a/encode.go
+++ b/encode.go
@@ -8,7 +8,6 @@ import (
"bytes"
"encoding"
"encoding/base64"
- "encoding/json"
"fmt"
"io"
"reflect"
@@ -78,7 +77,7 @@ func NewEncoder(w io.Writer) *Encoder {
// may write partial output, whereas encodin/json would not have
// written anything.
//
-// [documentation for encoding/json.Marshal]: https://pkg.go.dev/encoding/json@go1.18#Marshal
+// [documentation for encoding/json.Marshal]: https://pkg.go.dev/encoding/json@go1.20#Marshal
func (enc *Encoder) Encode(obj any) (err error) {
if enc.isRoot {
enc.w.par.Reset()
@@ -96,12 +95,6 @@ func discardInt(_ int, err error) error {
return err
}
-var (
- encodableType = reflect.TypeOf((*Encodable)(nil)).Elem()
- jsonMarshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
- textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
-)
-
const startDetectingCyclesAfter = 1000
func encode(w *ReEncoder, val reflect.Value, escaper BackslashEscaper, quote bool, cycleDepth uint, cycleSeen map[any]struct{}) error {
@@ -145,7 +138,7 @@ func encode(w *ReEncoder, val reflect.Value, escaper BackslashEscaper, quote boo
if val.Kind() == reflect.Pointer && val.IsNil() {
return discardInt(w.WriteString("null"))
}
- obj, ok := val.Interface().(json.Marshaler)
+ obj, ok := val.Interface().(jsonMarshaler)
if !ok {
return discardInt(w.WriteString("null"))
}
@@ -246,13 +239,27 @@ func encode(w *ReEncoder, val reflect.Value, escaper BackslashEscaper, quote boo
return err
}
}
- case reflect.Float32, reflect.Float64:
+ case reflect.Float32:
if quote {
if err := w.WriteByte('"'); err != nil {
return err
}
}
- if err := encodeTODO(w, val); err != nil {
+ if err := encodeFloat(w, 32, val); err != nil {
+ return err
+ }
+ if quote {
+ if err := w.WriteByte('"'); err != nil {
+ return err
+ }
+ }
+ case reflect.Float64:
+ if quote {
+ if err := w.WriteByte('"'); err != nil {
+ return err
+ }
+ }
+ if err := encodeFloat(w, 64, val); err != nil {
return err
}
if quote {
@@ -522,14 +529,3 @@ func encodeArray(w *ReEncoder, val reflect.Value, escaper BackslashEscaper, cycl
}
return nil
}
-
-func encodeTODO(w io.Writer, val reflect.Value) error {
- bs, err := json.Marshal(val.Interface())
- if err != nil {
- return err
- }
- if _, err := w.Write(bs); err != nil {
- return err
- }
- return nil
-}