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.

153 lines
3.3 KiB

// ------------------------------------------------------------------------
// Project atila
// Active Thing (activething.com) git.activething.com/go
//
// File name rRFields_type.go
// Created by DEV
// Modified 26/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 reflects
type (
RStruct struct {
Fields RFields
NameIndex map[string]int
}
)
/*
func NewRStruct (rtype reflect.Type) *RStruct {
res := &RStruct{
Fields : make(RFields,0,rtype.NumField()),
NameIndex: make(map[string]int),
}
cur := RFields{}
nxt := RFields{{ RType: rtype }}
var (
cnt,nxc map[reflect.Type]int
vis map[reflect.Type]struct{}
nms bytes.Buffer
)
for len(nxt) > 0 {
cur, nxt = nxt, cur[:0]
cnt, nxc = nxc, map[reflect.Type]int{}
for _,f := range cur {
if _,h := vis[f.RType]; h {
continue
}
vis[f.RType]=struct{}{}
for i :=0; i<f.RType.NumField(); i++ {
sf := f.RType.Field(i)
if sf.Anonymous {
st := sf.Type
if st.Kind() == reflect.Pointer {
st = st.Elem()
}
if !sf.IsExported() && st.Kind() != reflect.Struct {
continue
}
} else if !sf.IsExported() {
continue
}
nm := false
tags,ok := parseTag(sf,"json",nil)
if ok {
if tags.Has("-") {
continue
}
if isValidTag(tags[0]) {
nm=true
}
}
ft := sf.Type
if ft.Name() == "" && ft.Kind() == reflect.Pointer {
ft=ft.Elem()
}
//qt := false
//if tags.Has("string") {
// 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:
// qt = true
// }
//}
index := make([]int, len(f.Index)+1)
copy(index, f.Index)
index[len(f.Index)] = i
var name string
if nm || sf.Anonymous || ft.Kind() != reflect.Struct {
if nm {
name = tags[0]
} else {
name = sf.Name
}
res.Fields = append(res.Fields, RField{
RField: sf,
RType: ft,
Name: name,
BName: []byte(name),
Tags: map[string]slices.String{"json": append(slices.String(nil), tags...)},
})
if cnt[f.RType] > 1 {
res.Fields = append(res.Fields, res.Fields[len(res.Fields)-1])
}
continue
}
nxc[ft]++
if nxc[ft] == 1 {
nxt = append(nxt, RField{
RType: ft,
Name: ft.Name(),
Index: index,
})
}
}
}
}
for i,f := range res.Fields {
res.NameIndex[f.Name]=i
}
return res
}
*/

Powered by TurnKey Linux.