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/pjson"
"fmt"
"time"
)
func main() {
@ -35,21 +36,44 @@ func main() {
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) {
//mp.KeyValueBool("boolean",true)
//mp.KeyValueBinary("binary",[]byte{22,121,21,23,23,54,67})
mp.KeyValue("fb0",slc2)
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.KeyValueDate("date",time.Now())
//mp.KeyValueInt16("<unakey>",34)
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.KeyValueInt16("una",34)
/*
mp.KeyValueObject("MiObjeto",func(op packs.ObjectPacker){
op.FieldFloat64("fb1",43433.3)
op.FieldInt32("fb1",43433)
op.FieldString ("fb2","aaaaa")
op.Field("fb3",slc)
})
*/
})

@ -27,7 +27,6 @@ import (
"activething.com/go/gogo/core/bins"
"activething.com/go/gogo/core/slices"
"activething.com/go/gogo/core/syncs"
"fmt"
"sync/atomic"
)
@ -110,28 +109,22 @@ func (s *State) SetKey(key string) bool {
func (s *State) Open(kind NodeKind) bool {
if s.Error != nil {
return false
}
func (s *State) Open(kind NodeKind) {
if s.Node.Kind == NodeKindValue {
if s.Node.Start > s.Len() {
return !s.SetError(G.ErrInvalidNode)
if s.Len() > 0 {
s.SetError(G.ErrInvalidNode)
return
}
s.Node.Init(s.Node.Parent, kind, s.Len())
} else {
s.Node = G.nodePool.Get().Init(s.Node, kind, s.Len())
return
}
return true
s.Node = G.nodePool.Get().Init(s.Node, kind, s.Len())
}
func (s *State) Close() bool {
if s.Error != nil {
return false
}
func (s *State) Close() {
if s.Node.Kind == NodeKindValue {
return !s.SetError(G.ErrInvalidNode)
s.SetError(G.ErrInvalidNode)
return
}
if s.Node.Parent != nil {
@ -140,9 +133,6 @@ func (s *State) Close() bool {
G.nodePool.Put(p.Reset())
}
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 (
"activething.com/go/gogo/packs"
"fmt"
"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) ItemList (builder func(packer packs.ListPacker)) { p.addItem().ItemList (builder) }
func (p *Packer) ItemMap (builder func(packer packs.MapPacker )) { p.addItem().ItemMap (builder) }
func (p *Packer) ItemObject(builder func(packer packs.ObjectPacker)) { p.addItem().ItemObject(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().PackMap (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,
},
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 :
@ -538,13 +536,12 @@ func (p *Packer) packListReflected (value reflect.Value) {
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
}
p.packListReflected(rv)
})
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.