redefiniendo el builder

packs2
DEV 3 years ago
parent 9dfaa3659d
commit f5a449712c

@ -28,6 +28,7 @@ import (
"activething.com/go/gogo/packs" "activething.com/go/gogo/packs"
"activething.com/go/gogo/packs/pjson" "activething.com/go/gogo/packs/pjson"
"fmt" "fmt"
"time"
) )
func main() { func main() {
@ -35,21 +36,44 @@ func main() {
pk := pjson.NewPacker() pk := pjson.NewPacker()
slc := [][]int16 {[]int16{1,2,3,4},[]int16{16,26,36,46}} slc2 := [][]int16 {{1,2,3,4},{16,26,36,46}}
//slc2:= [][]int16 {{}}
slc2 = append(slc2,slc2 ...)
pk.PackMap(func(mp packs.MapPacker) { pk.PackMap(func(mp packs.MapPacker) {
//mp.KeyValueBool("boolean",true) mp.KeyValue("fb0",slc2)
//mp.KeyValueBinary("binary",[]byte{22,121,21,23,23,54,67}) mp.KeyValueList("l01",func(l packs.ListPacker){
l.ItemList(func(l1 packs.ListPacker){
l1.ItemUInt64(11)
l1.ItemUInt64(22)
})
l.ItemList(func(l1 packs.ListPacker){
l1.ItemUInt64(33)
l1.ItemUInt64(44)
})
})
mp.KeyValueBool("boolean",true)
mp.KeyValueFloat32("bf",12223234.34234)
mp.KeyValueBinary("binary",[]byte{22,121,21,23,23,54,67})
//mp.KeyValueDate("date",time.Now()) mp.KeyValueDate("date",time.Now())
//mp.KeyValueInt16("<unakey>",34) mp.KeyValueInt16("una",34)
/*
mp.KeyValueObject("MiObjeto",func(op packs.ObjectPacker){ mp.KeyValueObject("MiObjeto",func(op packs.ObjectPacker){
op.FieldFloat64("fb1",43433.3) op.FieldInt32("fb1",43433)
op.FieldString ("fb2","aaaaa") op.FieldString ("fb2","aaaaa")
op.Field("fb3",slc) op.Field("fb3",slc)
}) })
*/
}) })

@ -27,7 +27,6 @@ import (
"activething.com/go/gogo/core/bins" "activething.com/go/gogo/core/bins"
"activething.com/go/gogo/core/slices" "activething.com/go/gogo/core/slices"
"activething.com/go/gogo/core/syncs" "activething.com/go/gogo/core/syncs"
"fmt"
"sync/atomic" "sync/atomic"
) )
@ -110,28 +109,22 @@ func (s *State) SetKey(key string) bool {
func (s *State) Open(kind NodeKind) bool { func (s *State) Open(kind NodeKind) {
if s.Error != nil {
return false
}
if s.Node.Kind == NodeKindValue { if s.Node.Kind == NodeKindValue {
if s.Node.Start > s.Len() { if s.Len() > 0 {
return !s.SetError(G.ErrInvalidNode) s.SetError(G.ErrInvalidNode)
return
} }
s.Node.Init(s.Node.Parent, kind, s.Len()) s.Node.Init(s.Node.Parent, kind, s.Len())
} else { return
s.Node = G.nodePool.Get().Init(s.Node, kind, s.Len())
} }
return true s.Node = G.nodePool.Get().Init(s.Node, kind, s.Len())
} }
func (s *State) Close() bool { func (s *State) Close() {
if s.Error != nil {
return false
}
if s.Node.Kind == NodeKindValue { if s.Node.Kind == NodeKindValue {
return !s.SetError(G.ErrInvalidNode) s.SetError(G.ErrInvalidNode)
return
} }
if s.Node.Parent != nil { if s.Node.Parent != nil {
@ -140,9 +133,6 @@ func (s *State) Close() bool {
G.nodePool.Put(p.Reset()) G.nodePool.Put(p.Reset())
} }
s.Node.Count++ s.Node.Count++
fmt.Printf("Level %d Count %d\n",s.Node.Level,s.Node.Count)
return true
} }

@ -25,7 +25,6 @@ package pjson
import ( import (
"activething.com/go/gogo/packs" "activething.com/go/gogo/packs"
"fmt"
"time" "time"
) )
@ -53,16 +52,8 @@ func (p *Packer) ItemFloat64 (value float64) { p.addItem().PackFloat64(value) }
func (p *Packer) ItemDate (value time.Time) { p.addItem().PackDate(value) } func (p *Packer) ItemDate (value time.Time) { p.addItem().PackDate(value) }
func (p *Packer) ItemList (builder func(packer packs.ListPacker)) { p.addItem().ItemList (builder) } func (p *Packer) ItemList (builder func(packer packs.ListPacker)) { p.addItem().PackList (builder) }
func (p *Packer) ItemMap (builder func(packer packs.MapPacker )) { p.addItem().ItemMap (builder) } func (p *Packer) ItemMap (builder func(packer packs.MapPacker )) { p.addItem().PackMap (builder) }
func (p *Packer) ItemObject(builder func(packer packs.ObjectPacker)) { p.addItem().ItemObject(builder) } func (p *Packer) ItemObject(builder func(packer packs.ObjectPacker)) { p.addItem().PackObject(builder) }
func (p *Packer) addItem () *Packer {
if p.state.Node.Count > 0 {
_ = p.state.WriteByte(',')
}
p.state.Node.Count++
fmt.Printf("Set %d.%d\n",p.state.Node.Level,p.state.Node.Count)
return p
}

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

Loading…
Cancel
Save

Powered by TurnKey Linux.