package msgpack
import (
)
const (
sortMapKeysFlag uint32 = 1 << iota
arrayEncodedStructsFlag
useCompactIntsFlag
useCompactFloatsFlag
useInternedStringsFlag
omitEmptyFlag
)
type writer interface {
io.Writer
WriteByte(byte) error
}
type byteWriter struct {
io.Writer
}
func ( io.Writer) byteWriter {
return byteWriter{
Writer: ,
}
}
func ( byteWriter) ( byte) error {
, := .Write([]byte{})
return
}
var encPool = sync.Pool{
New: func() interface{} {
return NewEncoder(nil)
},
}
func () *Encoder {
return encPool.Get().(*Encoder)
}
func ( *Encoder) {
.w = nil
encPool.Put()
}
func ( interface{}) ([]byte, error) {
:= GetEncoder()
var bytes.Buffer
.Reset(&)
:= .Encode()
:= .Bytes()
PutEncoder()
if != nil {
return nil,
}
return ,
}
type Encoder struct {
w writer
buf []byte
timeBuf []byte
dict map[string]int
flags uint32
structTag string
}
func ( io.Writer) *Encoder {
:= &Encoder{
buf: make([]byte, 9),
}
.Reset()
return
}
func ( *Encoder) () io.Writer {
return .w
}
func ( *Encoder) ( io.Writer) {
.ResetDict(, nil)
}
func ( *Encoder) ( io.Writer, map[string]int) {
.resetWriter()
.flags = 0
.structTag = ""
.dict =
}
func ( *Encoder) ( map[string]int, func(*Encoder) error) error {
:= .dict
.dict =
:= ()
.dict =
return
}
func ( *Encoder) ( io.Writer) {
if , := .(writer); {
.w =
} else {
.w = newByteWriter()
}
}
func ( *Encoder) ( bool) *Encoder {
if {
.flags |= sortMapKeysFlag
} else {
.flags &= ^sortMapKeysFlag
}
return
}
func ( *Encoder) ( string) {
.structTag =
}
func ( *Encoder) ( bool) {
if {
.flags |= omitEmptyFlag
} else {
.flags &= ^omitEmptyFlag
}
}
func ( *Encoder) ( bool) {
if {
.flags |= arrayEncodedStructsFlag
} else {
.flags &= ^arrayEncodedStructsFlag
}
}
func ( *Encoder) ( bool) {
if {
.flags |= useCompactIntsFlag
} else {
.flags &= ^useCompactIntsFlag
}
}
func ( *Encoder) ( bool) {
if {
.flags |= useCompactFloatsFlag
} else {
.flags &= ^useCompactFloatsFlag
}
}
func ( *Encoder) ( bool) {
if {
.flags |= useInternedStringsFlag
} else {
.flags &= ^useInternedStringsFlag
}
}
func ( *Encoder) ( interface{}) error {
switch v := .(type) {
case nil:
return .EncodeNil()
case string:
return .EncodeString()
case []byte:
return .EncodeBytes()
case int:
return .EncodeInt(int64())
case int64:
return .encodeInt64Cond()
case uint:
return .EncodeUint(uint64())
case uint64:
return .encodeUint64Cond()
case bool:
return .EncodeBool()
case float32:
return .EncodeFloat32()
case float64:
return .EncodeFloat64()
case time.Duration:
return .encodeInt64Cond(int64())
case time.Time:
return .EncodeTime()
}
return .EncodeValue(reflect.ValueOf())
}
func ( *Encoder) ( ...interface{}) error {
for , := range {
if := .Encode(); != nil {
return
}
}
return nil
}
func ( *Encoder) ( reflect.Value) error {
:= getEncoder(.Type())
return (, )
}
func ( *Encoder) () error {
return .writeCode(msgpcode.Nil)
}
func ( *Encoder) ( bool) error {
if {
return .writeCode(msgpcode.True)
}
return .writeCode(msgpcode.False)
}
func ( *Encoder) ( time.Duration) error {
return .EncodeInt(int64())
}
func ( *Encoder) ( byte) error {
return .w.WriteByte()
}
func ( *Encoder) ( []byte) error {
, := .w.Write()
return
}
func ( *Encoder) ( string) error {
, := .w.Write(stringToBytes())
return
}