You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
active/apacks/pkjson/rpacker_list.go

134 lines
2.5 KiB

// ------------------------------------------------------------------------
// 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<v.Len(); i++ {
if i > 0 {
s.WriteByte(',')
}
p.packFn(s,v.Index(i),f)
if s.Error != nil {
return
}
}
s.Close(']')
}

Powered by TurnKey Linux.