// ------------------------------------------------------------------------ // Project atila // Active Thing (activething.com) git.activething.com/go // // File name builder.go // Created by DEV // Modified 21/01/2024 // // Copyright 2024 activething.com // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ package jjson import ( "activething.com/go/gogo/core/opts" "activething.com/go/gogo/core/syncs" "activething.com/go/gogo/packs" "encoding/json" "reflect" "sync/atomic" "time" ) const( maxDeepUncheck = 100 ) type ( Builder struct { options Options encoder *json.Encoder dateLayout string scratch [64]byte state *__packs.State } ) func NewBuilder(options ...opts.OptionFnc[Builder]) *Builder { if atomic.CompareAndSwapUint32(&G.sentinel,0,1) { G.builderPool = syncs.NewPool[Builder]( syncs.PoolWithNew[Builder](func() *Builder { return &Builder{ options : jsonOptionsDefaults, state : __packs.NewState(), dateLayout: time.RFC822Z, } }), ) } return opts.Apply(G.builderPool.Get(),options...) } func releaseBuilder(builder *Builder) { if builder != nil { builder.reset() if atomic.LoadUint32(&G.sentinel) == 1 { G.builderPool.Put(builder) } } } func (b *Builder) Any (value any) { switch value.(type) { default: rv := reflect.ValueOf(value) switch rv.Kind() { case reflect.Struct : b.objPacker(rv) case reflect.Map : b.mapPacker(rv) case reflect.Slice : b.listPacker(rv) } } } func (b *Builder) BuildMap (builder func(packer __packs.BuilderMap)) {} func (b *Builder) BuildList(builder func(packer __packs.BuilderList)) {} func (b *Builder) BuildObject(builder func(packer __packs.BuilderList)) {} func (b *Builder) reset () *Builder { //todo b.options = jsonOptionsDefaults b.encoder = nil b.dateLayout = time.RFC822Z b.state.Reset() return b } func stringifyKey(key reflect.Value, ops Options) (string,bool) { return "ss",true }