gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/schemax/justify.go (about)

     1  package schemax
     2  
     3  import (
     4  	"gitee.com/zhongguo168a/gocodes/datax"
     5  	"gitee.com/zhongguo168a/gocodes/datax/schemax/basickind"
     6  	"gitee.com/zhongguo168a/gocodes/myx/errorx"
     7  )
     8  
     9  // JustifyObject 如果是数字,会转化成正确的类型
    10  func JustifyObject(obj datax.M, decl *ClassDecl) (result datax.M, err error) {
    11  	return justifyObject(obj, decl)
    12  }
    13  
    14  // todo: 不完整
    15  func justifyObject(obj datax.M, decl *ClassDecl) (datax.M, error) {
    16  	result := datax.M{}
    17  	for _, field := range decl.GetAllField() {
    18  		fname := field.Name
    19  		ival, has := obj[fname]
    20  		if !has && ival == nil {
    21  			continue
    22  		}
    23  		switch ftyp := field.Type.(type) {
    24  		case *ClassType:
    25  			iResult, err := justifyClassType(ival, ftyp)
    26  			if err != nil {
    27  				return nil, errorx.Wrap(err, "justify class", datax.M{"name": fname})
    28  			}
    29  			result[fname] = iResult
    30  		case *ArrayType:
    31  			iResult, err := justifyArrayType(ival, ftyp)
    32  			if err != nil {
    33  				return nil, errorx.Wrap(err, "justify array", datax.M{"name": fname})
    34  			}
    35  			result[fname] = iResult
    36  		case *MapType:
    37  			iResult, err := justifyMapType(ival, ftyp)
    38  			if err != nil {
    39  				return nil, errorx.Wrap(err, "justify map", datax.M{"name": fname})
    40  			}
    41  			result[fname] = iResult
    42  		case *EnumType:
    43  			iResult, err := JustifyEnumType(ival, ftyp)
    44  			if err != nil {
    45  				return nil, errorx.Wrap(err, "justify enum", datax.M{"name": fname})
    46  			}
    47  			result[fname] = iResult
    48  		case *AnyType:
    49  			result[fname] = ival
    50  		case *BasicType:
    51  			tagType := field.Tags["type"]
    52  			switch tagType {
    53  			default:
    54  				iResult, err := justifyBasicType(ival, ftyp)
    55  				if err != nil {
    56  					return nil, errorx.Wrap(err, "justify basic", datax.M{"name": fname})
    57  				}
    58  				result[fname] = iResult
    59  			}
    60  
    61  		}
    62  
    63  	}
    64  
    65  	return result, nil
    66  }
    67  
    68  func justifyClassType(ival interface{}, ftyp *ClassType) (datax.M, error) {
    69  	mval, ok := ival.(map[string]interface{})
    70  	if ok == false {
    71  		return nil, errorx.New("value not map[string]interface{}")
    72  	}
    73  
    74  	typDecl := GetDeclByKey(ftyp.Decl)
    75  	if typDecl == nil {
    76  		return nil, errorx.New("decl not found", datax.M{"class": ftyp.Decl})
    77  	}
    78  
    79  	return justifyObject(mval, typDecl.(*ClassDecl))
    80  }
    81  
    82  func justifyArrayType(ival interface{}, ftyp *ArrayType) ([]interface{}, error) {
    83  	if ival == nil {
    84  		return nil, nil
    85  	}
    86  	arrValue, ok := ival.([]interface{})
    87  	if ok == false {
    88  		return nil, errorx.New("value not []interface{}")
    89  	}
    90  
    91  	newObj := make([]interface{}, len(arrValue))
    92  	for index, val := range arrValue {
    93  		switch etyp := ftyp.Elem.(type) {
    94  		case *ClassType:
    95  			iResult, err := justifyClassType(val, etyp)
    96  			if err != nil {
    97  				return nil, errorx.Wrap(err, "justify map", datax.M{"index": index})
    98  			}
    99  			newObj[index] = iResult
   100  		case *BasicType:
   101  			iResult, err := justifyBasicType(val, etyp)
   102  			if err != nil {
   103  				return nil, errorx.Wrap(err, "justify basic", datax.M{"index": index})
   104  			}
   105  			newObj[index] = iResult
   106  		case *EnumType:
   107  			iResult, err := JustifyEnumType(val, etyp)
   108  			if err != nil {
   109  				return nil, errorx.Wrap(err, "justify map", datax.M{"index": index})
   110  			}
   111  			newObj[index] = iResult
   112  		default:
   113  			return nil, errorx.New("not support type: " + etyp.String())
   114  
   115  		}
   116  		newObj[index] = val
   117  	}
   118  
   119  	return newObj, nil
   120  }
   121  
   122  func justifyMapType(ival interface{}, ftyp *MapType) (datax.M, error) {
   123  	if ival == nil {
   124  		return nil, nil
   125  	}
   126  	mval, ok := ival.(map[string]interface{})
   127  	if ok == false {
   128  		return nil, errorx.New("value not map[string]interface{}")
   129  	}
   130  
   131  	newObj := datax.M{}
   132  	for key, val := range mval {
   133  		switch etyp := ftyp.Value.(type) {
   134  		case *ClassType:
   135  			iResult, err := justifyClassType(val, etyp)
   136  			if err != nil {
   137  				return nil, errorx.Wrap(err, "justify map", datax.M{"key": key})
   138  			}
   139  			newObj[key] = iResult
   140  		case *BasicType:
   141  			iResult, err := justifyBasicType(val, etyp)
   142  			if err != nil {
   143  				return nil, errorx.Wrap(err, "justify basic", datax.M{"key": key})
   144  			}
   145  			newObj[key] = iResult
   146  		case *EnumType:
   147  			iResult, err := JustifyEnumType(val, etyp)
   148  			if err != nil {
   149  				return nil, errorx.Wrap(err, "justify map", datax.M{"key": key})
   150  			}
   151  			newObj[key] = iResult
   152  		default:
   153  			return nil, errorx.New("not support type: " + etyp.String())
   154  
   155  		}
   156  		newObj[key] = val
   157  	}
   158  
   159  	return newObj, nil
   160  }
   161  
   162  func JustifyEnumType(ival interface{}, ftyp *EnumType) (interface{}, error) {
   163  	typDecl := GetDeclByKey(ftyp.Decl)
   164  	if typDecl == nil {
   165  		return nil, errorx.New("decl not found", datax.M{"enum": ftyp.Decl})
   166  	}
   167  	enumDecl := typDecl.(*EnumDecl)
   168  
   169  	return basickind.ConvertKindToStruct(basickind.Kind(enumDecl.Kind), ival), nil
   170  }
   171  func justifyBasicType(ival interface{}, ftyp *BasicType) (interface{}, error) {
   172  	return basickind.ConvertKindToStruct(ftyp.Kind, ival), nil
   173  }