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  }