gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/reflectx/reflectx.go (about) 1 package reflectx 2 3 import ( 4 "errors" 5 "gitee.com/zhongguo168a/gocodes/datax/schemax" 6 "gitee.com/zhongguo168a/gocodes/datax/schemax/basickind" 7 "sync" 8 ) 9 10 var ( 11 data = &sync.Map{} 12 ) 13 14 func AddTypeList(reftypes []IRefType) { 15 for _, val := range reftypes { 16 data.Store(val.RefType(), val) 17 } 18 19 } 20 21 func AddType(reftype IRefType) { 22 data.Store(reftype.RefType(), reftype) 23 } 24 25 func GetTypeByKey(key string) IRefType { 26 val, has := data.Load(key) 27 if !has { 28 return nil 29 } 30 return val.(IRefType) 31 } 32 33 func GetType(key string) IRefType { 34 return GetTypeByKey(key) 35 } 36 37 func NewObject(key string) (val IRefObject, err error) { 38 stdesc := schemax.GetDeclByKey(key) 39 if stdesc == nil { 40 err = errors.New("schema not found: " + key) 41 return 42 } 43 44 ref := GetType(key) 45 if ref == nil { 46 err = errors.New("reftype not found: " + key) 47 return 48 } 49 obj := ref.RefNew() 50 initObj(obj, stdesc.(*schemax.ClassDecl)) 51 return obj, nil 52 } 53 54 func initObj(obj IRefObject, desc *schemax.ClassDecl) (err error) { 55 for _, field := range desc.Fields { 56 fname := field.Name 57 switch ftyp := field.Type.(type) { 58 case *schemax.ClassType: 59 if field.Value == "{}" { 60 st, newerr := NewObject(ftyp.Decl) 61 if newerr != nil { 62 err = errors.New("new object: " + err.Error()) 63 return 64 } 65 obj.(IRefField).RefSet(obj, fname, st) 66 } 67 case *schemax.ArrayType: 68 case *schemax.MapType: 69 if field.Value == "{}" { 70 obj.(IRefMap).RefMapNew(fname) 71 } 72 case *schemax.EnumType: 73 if field.Value == "" { 74 continue 75 } 76 idesc := schemax.GetDeclByKey(ftyp.Decl) 77 if idesc == nil { 78 err = errors.New("description not found: " + ftyp.Decl) 79 return 80 } 81 82 enumdesc := idesc.(*schemax.EnumDecl) 83 obj.(IRefField).RefSet(obj, field.Name, enumdesc.ConvertToValue(field.Value)) 84 case *schemax.BasicType: 85 if field.Value == "" { 86 continue 87 } 88 obj.(IRefField).RefSet(obj, field.Name, basickind.ConvertKindToStruct(ftyp.Kind, field.Value)) 89 case *schemax.AnyType: 90 } 91 } 92 return 93 }