// ------------------------------------------------------------------------ // Project atila // Active Thing (activething.com) git.activething.com/go // // File name packer_list.go // Created by DEV // Modified 05/02/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 pkjson import ( "apacks" "codecs/cjson" "reflect" ) type ( rList struct { packFn rPackerFnc } ) func rListPacker (rtype reflect.Type) rPackerFnc { lp := *newRList(rtype) if rtype.Elem().Kind() != reflect.Uint8 { return lp.pack } if rtype.Kind() == reflect.Slice { return lp.packBinarySlice } return lp.packBinary } func newRList(rtype reflect.Type) *rList { return &rList{ packFn: rTypePacker(rtype.Elem()) }} func (p rList) packBinary (s *apacks.State, v reflect.Value, f apacks.Flags) { if f.Binary() { packBinary(s, v.Interface().([]byte), f) return } p.pack(s,v,f) } func (p rList) packBinarySlice (s *apacks.State, v reflect.Value, f apacks.Flags) { if f.Binary() { packBinary(s, v.Interface().([]byte), f) return } p.packSlice(s,v,f) } func (p rList) packSlice(s *apacks.State, v reflect.Value, f apacks.Flags) { if v.IsNil() { s.W(cjson.G.NullValue) return } if s.Level > maxCyclesAfter { cp := struct { p interface{} l int }{ p: v.UnsafePointer(), l: v.Len(), } if fn,ok := s.CheckCycle(cp); ok { defer fn() } else { s.SetError(apacks.G.ErrRedundantPack) return } } p.pack(s,v,f) } func (p rList) pack (s *apacks.State, v reflect.Value, f apacks.Flags) { if v.IsNil() { s.W(cjson.G.NullValue) return } if v.Len() == 0 { s.Write2Byte('[',']') return } s.Open('[') for i:=0; i 0 { s.WriteByte(',') } p.packFn(s,v.Index(i),f) if s.Error != nil { return } } s.Close(']') }