diff options
Diffstat (limited to 'lib/lowmemjson/encode.go')
-rw-r--r-- | lib/lowmemjson/encode.go | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/lowmemjson/encode.go b/lib/lowmemjson/encode.go index c09fcc1..4bab7cb 100644 --- a/lib/lowmemjson/encode.go +++ b/lib/lowmemjson/encode.go @@ -256,8 +256,19 @@ func encode(w io.Writer, val reflect.Value, quote bool) { case val.Type().Elem().Kind() == reflect.Uint8: encodeWriteByte(w, '"') enc := base64.NewEncoder(base64.StdEncoding, w) - if _, err := enc.Write(val.Interface().([]byte)); err != nil { - panic(encodeError{err}) + if val.CanConvert(byteSliceType) { + if _, err := enc.Write(val.Convert(byteSliceType).Interface().([]byte)); err != nil { + panic(encodeError{err}) + } + } else { + // TODO: Surely there's a better way. + for i, n := 0, val.Len(); i < n; i++ { + var buf [1]byte + buf[0] = val.Index(i).Convert(byteType).Interface().(byte) + if _, err := enc.Write(buf[:]); err != nil { + panic(encodeError{err}) + } + } } if err := enc.Close(); err != nil { panic(encodeError{err}) @@ -282,7 +293,7 @@ func encode(w io.Writer, val reflect.Value, quote bool) { } } -func encodeString[T interface{ ~[]byte | ~string }](w io.Writer, str T) { +func encodeString[T interface{ []byte | string }](w io.Writer, str T) { encodeWriteByte(w, '"') for i := 0; i < len(str); { c, size := decodeRune(str[i:]) |