restructurando el codigo para actualizar los packs con la nueva arquitectura del builder

master
DEV 2 years ago
parent c695fe3271
commit ca0ba95339

@ -1,10 +1,9 @@
package main
import (
"apack/pkjson"
"errs"
"errs/efjson"
"errs/eftext"
"errs/erstfy"
"errs/wrap"
"fmt"
"math/rand"
@ -44,10 +43,13 @@ func main() {
e := wrap.WithTrace(*wrap.WithMessage(m,"mensage"),1)
l := wrap.WithInfo(e,func(i *wrap.Info){
i.Link = "http://nodes.com"
})
//e = wrap.WithFieldNew(e,"MiCampo",334.33)
@ -58,9 +60,53 @@ func main() {
*/
fmt.Printf("%s \n",string(erstfy.DefaultStringer().Stringify(e)))
fmt.Printf("%s \n",string(errs.Encode(e, efjson.Formatter())))
fmt.Printf("%s \n",string(errs.Encode(l, eftext.Formatter())))
//fmt.Printf("%s \n",string(erstfy.DefaultStringer().Stringify(e)))
//fmt.Printf("%s \n",string(errs.Encode(e, efjson.Formatter())))
//fmt.Printf("%s \n",string(errs.Encode(l, eftext.Formatter())))
p := pkjson.NewPacker()
r := p.Pack(l)
if !r.Ok() {
fmt.Printf("%s \n",string(errs.Encode(r.Fail(), eftext.Formatter())))
return
}
fmt.Printf("Data\n\n%s",string(r.Value()))
myMap := map[interface{}]interface{}{
1: "uno",
"dos": 2,
3.0: true,
true: 4.5,
"cinco": "seis",
7: 8,
"nueve": false,
10.11: "doce",
false: 13,
"catorce": 15.16,
}
r = p.Pack(map[string]string{"g":"dsd","aa":"myMap"})
if !r.Ok() {
fmt.Printf("%s \n",string(errs.Encode(r.Fail(), eftext.Formatter())))
return
}
fmt.Printf("Data\n\n%s",string(r.Value()))
r = p.Pack(myMap)
if !r.Ok() {
fmt.Printf("%s \n",string(errs.Encode(r.Fail(), eftext.Formatter())))
return
}
fmt.Printf("Data\n\n%s",string(r.Value()))
}

@ -268,7 +268,7 @@ func (b *Builder) Key(key any) blds.ValueBuilder {
b.writeSepIf(b.Current.Count > 0)
g.keyStringer.packStringifyKey(b,key)
if b.IsValue = b.Err == nil; b.IsValue {
if b.Current.IsValue = b.Err == nil; b.Current.IsValue {
b.B.WriteByte(fsep)
}
return b
@ -279,7 +279,7 @@ func (b *Builder) Field(name string) blds.ValueBuilder {
b.writeSepIf(b.Current.Count > 0)
b.packString(name,apack.FlagScapeHTML)
if b.IsValue = b.Err == nil; b.IsValue {
if b.Current.IsValue = b.Err == nil; b.Current.IsValue {
b.B.WriteByte(fsep)
}
return b
@ -300,17 +300,29 @@ func (b *Builder) makeLevel (mode pstate.Mode, isNil, isEmpty bool, maker func(b
return
}
b.Open(pstate.ModeMap)
b.Open(mode)
if b.Err != nil {
return
}
be := byte('}')
if mode == pstate.ModeList {
b.B.WriteByte('[')
be = ']'
} else {
b.B.WriteByte('{')
}
maker(b)
if b.Err != nil {
b.Close(mode)
b.postValue()
if b.Err == nil {
return
}
b.Close(mode)
b.B.WriteByte(be)
b.postValue()
}
@ -324,14 +336,14 @@ func (b *Builder) checkValue () {
if b.Err != nil {
panic(apack.G.ErrInvalidState.WithCause(b.Err))
}
if !b.IsValue {
if !b.Current.IsValue {
b.SetError(apack.G.ErrStateInvalidElem)
}
}
func (b *Builder) postValue() {
if b.Err != nil {
b.IsValue = false
if b.Err == nil {
b.Current.IsValue = false
b.Current.Count++
if b.Current.Mode == pstate.ModeValue {
b.Current.Mode = pstate.ModeNone

@ -30,6 +30,7 @@ import (
"encoding"
"errs"
"reflect"
"strconv"
"sync"
"time"
)
@ -84,6 +85,8 @@ func (s *keyStringer) packStringifyKey (b *Builder, key any) {
return
}
b.packString(v.Error(),apack.FlagScapeHTML)
default:
me := &rMapEntry{ v: reflect.ValueOf(key) }
@ -112,6 +115,7 @@ func (s *keyStringer) getOrBuildStringer(rtype reflect.Type) rMapEntryFnc {
if fn == nil && rtype.Kind() == reflect.Interface {
fn = s.interfaceStringer(rtype)
}
s.RUnlock()
if fn != nil {
s.Lock()
@ -160,18 +164,47 @@ func (s *keyStringer) interfaceStringer(rtype reflect.Type) rMapEntryFnc {
}
}
return func(e *rMapEntry, k reflect.Value) error {
k = k.Elem()
return func(e *rMapEntry, v reflect.Value) error {
s.RLock()
fn := s.stringers[rtype]
s.RUnlock()
if fn != nil {
return fn(e, v)
}
switch k.Kind() {
return apack.G.ErrInvalidKey
}
case reflect.String:
e.k = k.String()
return nil
case reflect.Bool:
e.k = strconv.FormatBool(k.Bool())
return nil
case reflect.Int,
reflect.Int8,
reflect.Int16,
reflect.Int32,
reflect.Int64:
e.k = strconv.FormatInt(k.Int(), 10)
return nil
case reflect.Uint,
reflect.Uint8,
reflect.Uint16,
reflect.Uint32,
reflect.Uint64,
reflect.Uintptr:
e.k = strconv.FormatUint(k.Uint(), 10)
return nil
case reflect.Float32:
e.k = cjson.JSONFloat(k.Float(),32)
return nil
case reflect.Float64:
e.k = cjson.JSONFloat(k.Float(),64)
return nil
default:
return apack.G.ErrInvalidKey.WithMessageF("%s", k.String())
}
}
}

@ -60,7 +60,7 @@ func NewPacker (options ...PackerFnc) *Packer {
func (p Packer) Pack (value any) rsls.Bytes {
b := newBuilder(p.f)
b.release()
defer b.release()
b.Any(value)
if b.Err != nil {
@ -71,6 +71,9 @@ func (p Packer) Pack (value any) rsls.Bytes {
func (b *Builder) packString (value string, flags apack.Flags) {
if len(value) == 0 {
b.B.Write2Byte('"','"')
@ -214,6 +217,8 @@ func packReflected(rtype reflect.Type) func (b *Builder, v reflect.Value) {
var wg sync.WaitGroup
var fn func(*Builder, reflect.Value)
wg.Add(1)
fi,ld := g.packersCache.LoadOrStore(rtype,func(builder *Builder, value reflect.Value){
wg.Wait()
fn(builder,value)
@ -278,10 +283,13 @@ func makePackReflectedFn(rtype reflect.Type) func(b *Builder, v reflect.Value) {
b.B.W(cjson.G.NullValue)
return
}
/*
if v.Elem().IsNil() {
packReflectedInvalid(b,v.Elem())
return
}
*/
packReflected(v.Elem().Type())(b,v.Elem())
}
@ -293,7 +301,8 @@ func makePackReflectedFn(rtype reflect.Type) func(b *Builder, v reflect.Value) {
return (*newRMap(rtype)).pack
case reflect.Struct:
return (*newRObject(rtype)).pack
default:
return packReflectedInvalid

@ -202,6 +202,46 @@ func newRObject(rtype reflect.Type) *rObject {
func (o rObject) pack (b *Builder, v reflect.Value) {
nx := byte('{')
FieldLoop:
for i:= range o.fields {
fd := &o.fields[i]
fv := v
for _,i := range fd.index {
if fv.Kind() == reflect.Pointer {
if fv.IsNil() {
continue FieldLoop
}
fv = fv.Elem()
}
fv = fv.Field(i)
}
if fd.flags.OmitEmpty() && isEmptyValue(v) {
continue
}
b.B.WriteByte(nx)
nx = ','
if fd.flags.EscapeHTML() {
b.B.WriteString(fd.nameS)
} else {
b.B.WriteString(fd.nameU)
}
fd.packerFn(b,fv)
}
if nx == '{' {
b.B.Write2Byte('{','}')
} else {
b.B.WriteByte('}')
}
}
func jsonTags (tag reflect.StructTag) (string, apack.Flags,bool) {
return apack.FlagsFromTag(tag,jsonTag,func(n string) apack.Flags {
switch n {

@ -26,6 +26,11 @@ package pstate
import "syns/pools"
const(
levelsLen = 10
)
var (
G = struct {
@ -35,10 +40,8 @@ var (
}
g = struct {
levelsLen int
statePool pools.GPool[State]
}{
levelsLen: 8,
statePool: *pools.NewGPool(pools.WithNew[State](func () *State {
return NewState()
})),

@ -37,7 +37,6 @@ type (
key any
field string
IsValue bool
Level int
levels []StateLevel
@ -68,7 +67,7 @@ func ReleaseState (state *State) {
func NewState(options ...StateFnc) *State {
return (&State{
B : bfrs.NewABuffer(),
levels: make([]StateLevel,g.levelsLen),
levels: make([]StateLevel,levelsLen),
}).init(options) }
@ -76,6 +75,7 @@ func NewState(options ...StateFnc) *State {
func (s *State) init (options []StateFnc) *State {
for _,o := range options { o(s) }
s.levels[0].Ini(ModeValue,0)
s.Current = &s.levels[0]
return s
}
@ -83,7 +83,6 @@ func (s *State) reset () *State {
s.B.Reset()
s.key = nil
s.field = ""
s.IsValue = false
s.Level = 0
s.Pos = 0
s.Err = nil
@ -92,7 +91,7 @@ func (s *State) reset () *State {
for i := 0; i<len(s.levels); i++ {
(&s.levels[i]).Ini(ModeNone,0)
}
s.levels = s.levels[:g.levelsLen]
s.levels = s.levels[:levelsLen]
return s
}
@ -102,7 +101,7 @@ func (s *State) reset () *State {
func (s *State) Open (mode Mode) {
s.Level++
if s.Level > g.levelsLen {
if s.Level > levelsLen {
s.levels = append(s.levels, *((&(StateLevel{})).Ini(mode, s.B.Len())))
} else {
(&s.levels[s.Level]).Ini(mode, s.B.Len())

@ -32,6 +32,7 @@ type (
Pos int
Count int
Mode Mode
IsValue bool
Name string
Key any
}
@ -46,6 +47,7 @@ func (s *StateLevel) Ini (mode Mode, start int) *StateLevel {
s.Count= 0
s.Name = ""
s.Key = nil
s.IsValue = mode == ModeValue
return s
}

@ -71,7 +71,7 @@ func Formatter() *TextFormatter {
WithSection(MainSection,
func(b *TextBuilder) {
b.AddTextAnsi(ansi.Code(0).SetFgColor(ansi.ColorRed), "# ERROR ------------------------------------------------------\n\n") },
b.AddTextAnsi(ansi.Code(0).SetFgColor(ansi.ColorRed), "\n# ERROR ------------------------------------------------------\n\n") },
func(b *TextBuilder) {
b.AddTextAnsi(ansi.Code(0).SetFgColor(ansi.ColorRed), "\n----------------------------------------------------- ERROR #\n") }),

@ -130,7 +130,7 @@ func defaultCollectors () FieldCollectors {
CollectFieldFnc(func (b blds.ObjectBuilder, e error ) bool {
if ms,is := e.(interface { Message() string }); is {
b.field(fieldNameMessage).String(ms.Message())
b.Field(fieldNameMessage).String(ms.Message())
return true
}
return false
@ -138,7 +138,7 @@ func defaultCollectors () FieldCollectors {
CollectFieldFnc(func (b blds.ObjectBuilder, e error ) bool {
if in,is := e.(interface { Info () string }); is {
b.field(fieldNameInfo).String(in.Info())
b.Field(fieldNameInfo).String(in.Info())
return true
}
return false
@ -146,7 +146,7 @@ func defaultCollectors () FieldCollectors {
CollectFieldFnc(func (b blds.ObjectBuilder, e error ) bool {
if tm,is := e.(interface { Time() time.Time }); is {
b.field(fieldNameTime).Time(tm.Time())
b.Field(fieldNameTime).Time(tm.Time())
return true
}
return false
@ -154,7 +154,7 @@ func defaultCollectors () FieldCollectors {
CollectFieldFnc(func (b blds.ObjectBuilder, e error ) bool {
if tm,is := e.(interface { Date() time.Time }); is {
b.field(fieldNameDate).Time(tm.Date())
b.Field(fieldNameDate).Time(tm.Date())
return true
}
return false
@ -162,7 +162,7 @@ func defaultCollectors () FieldCollectors {
CollectFieldFnc(func (b blds.ObjectBuilder, e error ) bool {
if tm,is := e.(interface { Param() string }); is {
b.field(fieldNameParam).String(tm.Param())
b.Field(fieldNameParam).String(tm.Param())
return true
}
return false
@ -170,7 +170,7 @@ func defaultCollectors () FieldCollectors {
CollectFieldFnc(func (b blds.ObjectBuilder, e error ) bool {
if tm,is := e.(interface { User() string }); is {
b.field(fieldNameUser).String(tm.User())
b.Field(fieldNameUser).String(tm.User())
return true
}
return false
@ -178,7 +178,7 @@ func defaultCollectors () FieldCollectors {
CollectFieldFnc(func (b blds.ObjectBuilder, e error ) bool {
if tm,is := e.(interface { Source() string }); is {
b.field(fieldNameSource).String(tm.Source())
b.Field(fieldNameSource).String(tm.Source())
return true
}
return false

@ -38,7 +38,7 @@ type objectBuilder struct {
}
func (b *objectBuilder) field(name string) blds.ValueBuilder {
func (b *objectBuilder) Field(name string) blds.ValueBuilder {
if b.nexVal {
panic(G.ErrExpectedValue)
}

@ -83,8 +83,8 @@ func (e ErrParam) Stringify (_ bool) string {
}
func (e ErrParam) BuildField (obuilder blds.ObjectBuilder) {
obuilder.field("message").String(e.message)
obuilder.field("param").String(e.param)
obuilder.Field("message").String(e.message)
obuilder.Field("param").String(e.param)
}

@ -119,17 +119,17 @@ func (e Info) Build (builder blds.Builder) {
builder.Object(
func(b blds.ObjectBuilder) {
e.BuildField(b)
b.field("error").Error(e.error)
b.Field("error").Error(e.error)
})
}
func (e Info) BuildField (builder blds.ObjectBuilder) {
builder.field("message").String(e.Message)
builder.field("info").String(e.Info)
builder.field("desc").String(e.Desc)
builder.field("link").String(e.Link)
builder.field("help").String(e.Help)
builder.field("date").Time(e.Date)
builder.Field("message").String(e.Message)
builder.Field("info").String(e.Info)
builder.Field("desc").String(e.Desc)
builder.Field("link").String(e.Link)
builder.Field("help").String(e.Help)
builder.Field("date").Time(e.Date)
}

@ -92,4 +92,4 @@ func (e Message) Stringify (partial bool) string {
func (e Message) BuildField (obuilder blds.ObjectBuilder) {
obuilder.field("message").String(e.message) }
obuilder.Field("message").String(e.message) }

@ -143,7 +143,7 @@ func (f Fields) indexOf(name string) int {
func (f Fields) Build (builder blds.Builder) {
builder.List(func(lb blds.ListBuilder) {
for _,fl := range f {
lb.item().Object(func(ob blds.ObjectBuilder){
lb.Item().Object(func(ob blds.ObjectBuilder){
fl.BuildField(ob)
})
}

@ -243,7 +243,7 @@ func (f GField[T]) Build (builder blds.Builder) {
func (f GField[T]) BuildField (obuilder blds.ObjectBuilder) {
vb := obuilder.field(f.name)
vb := obuilder.Field(f.name)
switch f.Kind() {
case KindAny :
case KindBool : vb.Bool (f.Value().(bool))

Loading…
Cancel
Save

Powered by TurnKey Linux.