|
|
|
|
@ -57,7 +57,7 @@ func NewPacker (options ...opts.OptionFnc[Packer]) *Packer {
|
|
|
|
|
dateLayout: time.RFC822Z,
|
|
|
|
|
},
|
|
|
|
|
state : packs.NewState(),
|
|
|
|
|
})
|
|
|
|
|
}, options ...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -174,7 +174,7 @@ func (p *Packer) PackRaw (value []byte) {
|
|
|
|
|
_ = p.state.WriteByte('"')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -209,7 +209,7 @@ func (p *Packer) PackBinary (value []byte) {
|
|
|
|
|
}
|
|
|
|
|
_ = p.state.WriteByte('"')
|
|
|
|
|
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -222,7 +222,7 @@ func (p *Packer) PackString(value string) {
|
|
|
|
|
|
|
|
|
|
if len(value) == 0 {
|
|
|
|
|
p.state.Write2Byte('"','"')
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -280,7 +280,7 @@ func (p *Packer) PackString(value string) {
|
|
|
|
|
}
|
|
|
|
|
_ = p.state.WriteByte('"')
|
|
|
|
|
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -305,7 +305,7 @@ func (p *Packer) PackBool (value bool) {
|
|
|
|
|
_ = p.state.WriteByte('"')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Packer) PackInt8 (value int8) { p.PackInt64(int64(value)) }
|
|
|
|
|
@ -328,7 +328,7 @@ func (p *Packer) PackInt64 (value int64) {
|
|
|
|
|
_ = p.state.WriteByte('"')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Packer) PackUInt8 (value uint8 ) { p.PackUInt64(uint64(value)) }
|
|
|
|
|
@ -350,8 +350,6 @@ func (p *Packer) PackUInt64 (value uint64) {
|
|
|
|
|
if p.options.QuoteNumbers() {
|
|
|
|
|
_ = p.state.WriteByte('"')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Packer) PackFloat32 (value float32) { p.packFloat(float64(value),32) }
|
|
|
|
|
@ -370,11 +368,12 @@ func (p *Packer) packFloat (value float64, bits int) {
|
|
|
|
|
p.state.SetError(packs.G.ErrInvalidValue)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
_,_ = p.state.Write(b)
|
|
|
|
|
if p.options.QuoteNumbers() {
|
|
|
|
|
_ = p.state.WriteByte('"')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -389,26 +388,30 @@ func (p *Packer) PackDate (value time.Time) {
|
|
|
|
|
}))
|
|
|
|
|
_ = p.state.WriteByte('"')
|
|
|
|
|
|
|
|
|
|
//p.state.Node.Count++
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (p *Packer) PackList (builder func(packer packs.ListPacker)) {
|
|
|
|
|
p.packCompound(packs.NodeKindList,'[',']',func(pk *Packer) { builder (pk) })
|
|
|
|
|
p.packLOM(packs.NodeKindList,'[',']',func(pk *Packer) { builder (pk) })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Packer) PackMap (builder func(packer packs.MapPacker )) {
|
|
|
|
|
p.packCompound(packs.NodeKindMap,'{','}',func(pk *Packer) { builder (pk) })
|
|
|
|
|
p.packLOM(packs.NodeKindMap,'{','}',func(pk *Packer) { builder (pk) })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Packer) PackObject(builder func(packer packs.ObjectPacker)) {
|
|
|
|
|
p.packCompound(packs.NodeKindObject,'{','}',func(pk *Packer) { builder (pk) })
|
|
|
|
|
p.packLOM(packs.NodeKindObject,'{','}',func(pk *Packer) { builder (pk) })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (p *Packer) packCompound(kind packs.NodeKind, opening, closing byte, buildFnc func(*Packer)) {
|
|
|
|
|
func (p *Packer) packLOM(kind packs.NodeKind, opening, closing byte, buildFnc func(*Packer)) {
|
|
|
|
|
if p.state.Error != nil {
|
|
|
|
|
panic(p.state.Error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dn := false
|
|
|
|
|
defer func(d *bool) {
|
|
|
|
|
if !(*d) {
|
|
|
|
|
@ -416,14 +419,13 @@ func (p *Packer) packCompound(kind packs.NodeKind, opening, closing byte, buildF
|
|
|
|
|
}
|
|
|
|
|
}(&dn)
|
|
|
|
|
|
|
|
|
|
//p.addSep()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if p.state.Open(kind) {
|
|
|
|
|
p.state.Open(kind)
|
|
|
|
|
if p.state.Error == nil {
|
|
|
|
|
_ = p.state.WriteByte(opening)
|
|
|
|
|
buildFnc(p)
|
|
|
|
|
if p.state.Error == nil {
|
|
|
|
|
if p.state.Close() {
|
|
|
|
|
p.state.Close()
|
|
|
|
|
if p.state.Error == nil {
|
|
|
|
|
_ = p.state.WriteByte(closing)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -438,37 +440,17 @@ func (p *Packer) packCompound(kind packs.NodeKind, opening, closing byte, buildF
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (p *Packer) addSep () *Packer {
|
|
|
|
|
if p.state.Node.Count > 0 {
|
|
|
|
|
_ = p.state.WriteByte(',')
|
|
|
|
|
}
|
|
|
|
|
return p
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (p *Packer) addKey (key any, call func(*Packer)) {
|
|
|
|
|
if p.state.Error != nil {
|
|
|
|
|
panic(p.state.Error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p.addSep()
|
|
|
|
|
k := stringifyKey(p.state.Temp[0:],key)
|
|
|
|
|
if k == nil {
|
|
|
|
|
p.state.SetError(packs.G.ErrInvalidKey)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ks := string(k)
|
|
|
|
|
if !p.options.IgnoreKeys() && !p.state.SetKey(ks) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p.PackString(ks)
|
|
|
|
|
_ = p.state.WriteByte(':')
|
|
|
|
|
call(p)
|
|
|
|
|
|
|
|
|
|
p.addField(string(k),call)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -477,7 +459,10 @@ func (p *Packer) addField (name string, call func(*Packer)) {
|
|
|
|
|
panic(p.state.Error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p.addSep()
|
|
|
|
|
if p.state.Node.Count > 0 {
|
|
|
|
|
_ = p.state.WriteByte(',')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if !p.options.IgnoreKeys() && !p.state.SetKey(name) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
@ -485,7 +470,15 @@ func (p *Packer) addField (name string, call func(*Packer)) {
|
|
|
|
|
p.PackString(name)
|
|
|
|
|
_ = p.state.WriteByte(':')
|
|
|
|
|
call(p)
|
|
|
|
|
p.state.Node.Count++
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (p *Packer) addItem () *Packer {
|
|
|
|
|
if p.state.Node.Count > 0 {
|
|
|
|
|
_ = p.state.WriteByte(',')
|
|
|
|
|
}
|
|
|
|
|
p.state.Node.Count++
|
|
|
|
|
return p
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -505,18 +498,23 @@ func (p *Packer) packListReflected (value reflect.Value) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprobamos las llamadas recursivas
|
|
|
|
|
/*
|
|
|
|
|
if p.state.Node.Level > notDetectingCycles {
|
|
|
|
|
rf := value.Interface()
|
|
|
|
|
if _,is := p.checks[rf]; is {
|
|
|
|
|
pt := struct {
|
|
|
|
|
ptr interface{}
|
|
|
|
|
len int
|
|
|
|
|
} {
|
|
|
|
|
ptr : value.UnsafePointer(),
|
|
|
|
|
len : value.Len(),
|
|
|
|
|
}
|
|
|
|
|
if _,has := p.checks[pt]; has {
|
|
|
|
|
p.state.SetError(packs.G.ErrRedundantPack)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
p.checks[rf]=struct{}{}
|
|
|
|
|
defer delete(p.checks,rf)
|
|
|
|
|
p.checks[pt]=struct{}{}
|
|
|
|
|
defer delete(p.checks,pt)
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch tp.Elem().Kind() {
|
|
|
|
|
case reflect.String :
|
|
|
|
|
@ -537,15 +535,14 @@ func (p *Packer) packListReflected (value reflect.Value) {
|
|
|
|
|
reflect.Float64:
|
|
|
|
|
p.buildList(value, func(bl packs.ListPacker, rv reflect.Value){ bl.ItemFloat64(rv.Float()) })
|
|
|
|
|
case reflect.Slice :
|
|
|
|
|
p.buildList(value, func(bl packs.ListPacker, rv reflect.Value){
|
|
|
|
|
p.packListReflected(rv) // Llamamos recursivamente a packListReflected para cada elemento del slice
|
|
|
|
|
if p.state.Error != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
case reflect.Map :
|
|
|
|
|
case reflect.Struct :
|
|
|
|
|
|
|
|
|
|
p.buildList(value, func(bl packs.ListPacker, rv reflect.Value){
|
|
|
|
|
p.packListReflected(rv)
|
|
|
|
|
})
|
|
|
|
|
default:
|
|
|
|
|
p.buildList(value, func(bl packs.ListPacker, rv reflect.Value){
|
|
|
|
|
bl.Item(rv.Interface())
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|