diff options
Diffstat (limited to 'vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go')
-rw-r--r-- | vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go b/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go new file mode 100644 index 000000000..63fa01890 --- /dev/null +++ b/vendor/github.com/bytedance/sonic/internal/encoder/alg/primitives.go @@ -0,0 +1,95 @@ +/** + * Copyright 2024 ByteDance Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package alg + +import ( + "encoding" + "encoding/json" + + "github.com/bytedance/sonic/internal/encoder/vars" + "github.com/bytedance/sonic/internal/rt" +) + +func Compact(p *[]byte, v []byte) error { + buf := vars.NewBuffer() + err := json.Compact(buf, v) + + /* check for errors */ + if err != nil { + return err + } + + /* add to result */ + v = buf.Bytes() + *p = append(*p, v...) + + /* return the buffer into pool */ + vars.FreeBuffer(buf) + return nil +} + +func EncodeNil(rb *[]byte) error { + *rb = append(*rb, 'n', 'u', 'l', 'l') + return nil +} + +// func Make_EncodeTypedPointer(computor func(*rt.GoType, ...interface{}) (interface{}, error)) func(*[]byte, *rt.GoType, *unsafe.Pointer, *vars.Stack, uint64) error { +// return func(buf *[]byte, vt *rt.GoType, vp *unsafe.Pointer, sb *vars.Stack, fv uint64) error { +// if vt == nil { +// return EncodeNil(buf) +// } else if fn, err := vars.FindOrCompile(vt, (fv&(1<<BitPointerValue)) != 0, computor); err != nil { +// return err +// } else if vt.Indirect() { +// err := fn(buf, *vp, sb, fv) +// return err +// } else { +// err := fn(buf, unsafe.Pointer(vp), sb, fv) +// return err +// } +// } +// } + +func EncodeJsonMarshaler(buf *[]byte, val json.Marshaler, opt uint64) error { + if ret, err := val.MarshalJSON(); err != nil { + return err + } else { + if opt&(1<<BitCompactMarshaler) != 0 { + return Compact(buf, ret) + } + if opt&(1<<BitNoValidateJSONMarshaler) == 0 { + if ok, s := Valid(ret); !ok { + return vars.Error_marshaler(ret, s) + } + } + *buf = append(*buf, ret...) + return nil + } +} + +func EncodeTextMarshaler(buf *[]byte, val encoding.TextMarshaler, opt uint64) error { + if ret, err := val.MarshalText(); err != nil { + return err + } else { + if opt&(1<<BitNoQuoteTextMarshaler) != 0 { + *buf = append(*buf, ret...) + return nil + } + *buf = Quote(*buf, rt.Mem2Str(ret), false) + return nil + } +} +
\ No newline at end of file |