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.

130 lines
2.9 KiB

// ------------------------------------------------------------------------
// Project atila
// Active Thing (activething.com) git.activething.com/go
//
// File name rpacker_object.go
// Created by DEV
// Modified 07/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 pjson
import (
"activething.com/go/gogo/packs"
"bytes"
"reflect"
)
type (
rObject struct {
fields rFieldList
nameIndex map[string]int
}
)
func newRObjectFields (rtype reflect.Type) *rObject {
cur := []rObjectField{}
nxt := []rObjectField{{ rtype: rtype}}
var fls []rObjectField
var nms bytes.Buffer
var cnt, nxCnt map[reflect.Type]bool
vis := map[reflect.Type]bool{}
for len(nxt) > 0 {
cur,nxt = nxt,cur[:0]
for _,f := range cur {
if vis[f.rtype] {
continue
}
vis[f.rtype]=true
for i:=0; i<f.rtype.NumField(); i++ {
sf := f.rtype.Field(i)
if sf.Anonymous {
tp := sf.Type
if tp.Kind() == reflect.Pointer {
tp = tp.Elem()
}
if !sf.IsExported() && tp.Kind() != reflect.Struct {
continue
}
} else if !sf.IsExported() {
continue
}
nm,fg :=packs.TagPacksFlags(sf.Tag)
if nm == "-" || fg.Omit() {
continue
}
if !packs.CheckTag(nm) {
nm = ""
}
index:=make([]int,len(f.index)+1)
copy(index,f.index)
index[len(f.index)] = i
ft := sf.Type
if ft.Name() == "" && ft.Kind() == reflect.Pointer {
ft = ft.Elem()
}
if fg.String() && !fg.Quote() {
switch ft.Kind() {
case reflect.Bool,
reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr,
reflect.Float32, reflect.Float64,
reflect.String:
fg = fg|packs.FlagQuote
}
}
if nm != "" || !sf.Anonymous || ft.Kind() != reflect.Struct {
tged := nm != ""
if nm == "" {
nm = sf.Name
}
of := rObjectField {
name : nm,
isTagged: tged,
index : index,
rtype : ft,
flags : fg,
}
of.nameB = []byte(of.name)
//todo of.equal
// Build nameEscHTML and nameNonEsc ahead of time.
nms.Reset()
}
}
}
}
return nil
}

Powered by TurnKey Linux.