gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/schemax/check.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  // 如果是数字,会转化成正确的类型
    10  func CheckType(valType IType, val interface{}) (err error) {
    11  	switch typ := valType.(type) {
    12  	case *EnumType:
    13  		err = checkEnumType(typ, val)
    14  	case *BasicType:
    15  		err = checkBasicType(typ, val)
    16  
    17  	}
    18  	return err
    19  }
    20  
    21  // 如果是数字,会转化成正确的类型
    22  func CheckObject(obj datax.M, decl *ClassDecl) (err error) {
    23  	return checkObject(obj, decl)
    24  }
    25  
    26  // todo: 不完整
    27  func checkObject(obj datax.M, decl *ClassDecl) error {
    28  	for _, field := range decl.GetAllField() {
    29  		fname := field.Name
    30  		val, has := obj[fname]
    31  		if !has && val == nil {
    32  			continue
    33  		}
    34  		var err error
    35  		switch typ := field.Type.(type) {
    36  		case *ClassType:
    37  			typDecl := GetDeclByKey(typ.Decl)
    38  			if typDecl == nil {
    39  				return errorx.New("decl not found", datax.M{"name": fname, "class": typ.Decl})
    40  			}
    41  			mval, ok := val.(map[string]interface{})
    42  			if ok == false {
    43  				return errorx.New("map value not map[string]interface{}", datax.M{"name": fname})
    44  			}
    45  			classErr := checkObject(mval, typDecl.(*ClassDecl))
    46  			if classErr != nil {
    47  				return errorx.Wrap(err, "check class", datax.M{"name": fname, "class": typ.Decl})
    48  			}
    49  		case *MapType:
    50  		case *EnumType:
    51  			err = checkEnumType(typ, val)
    52  		case *BasicType:
    53  			err = checkBasicType(typ, val)
    54  		}
    55  
    56  		if err != nil {
    57  			return errorx.Wrap(err, "check field", datax.M{"name": fname})
    58  		}
    59  	}
    60  
    61  	return nil
    62  }
    63  
    64  func checkEnumType(typ *EnumType, val interface{}) error {
    65  	iedecl := GetDeclByKey(typ.Decl)
    66  	if iedecl == nil {
    67  		return errorx.New("decl not found", datax.M{"decl": typ.Decl})
    68  	}
    69  	edecl := iedecl.(*EnumDecl)
    70  	kind := basickind.Kind(edecl.Kind)
    71  	switch kind {
    72  	case basickind.Int8:
    73  		fallthrough
    74  	case basickind.Int16:
    75  		fallthrough
    76  	case basickind.Int32:
    77  		fallthrough
    78  	case basickind.Int64:
    79  		fallthrough
    80  	case basickind.Uint8:
    81  		fallthrough
    82  	case basickind.Uint16:
    83  		fallthrough
    84  	case basickind.Uint32:
    85  		fallthrough
    86  	case basickind.Uint64:
    87  		switch val.(type) {
    88  		case int:
    89  		default:
    90  			return errorx.New("not number")
    91  		}
    92  	case basickind.String:
    93  		switch val.(type) {
    94  		case string:
    95  		default:
    96  			return errorx.New("not string")
    97  		}
    98  	}
    99  
   100  	return nil
   101  }
   102  
   103  func checkBasicType(typ *BasicType, val interface{}) error {
   104  	switch typ.Kind {
   105  	case basickind.Bool:
   106  		switch val.(type) {
   107  		case bool:
   108  		default:
   109  			return errorx.New("not bool")
   110  		}
   111  	case basickind.Int8:
   112  		fallthrough
   113  	case basickind.Int16:
   114  		fallthrough
   115  	case basickind.Int32:
   116  		fallthrough
   117  	case basickind.Int64:
   118  		fallthrough
   119  	case basickind.Uint8:
   120  		fallthrough
   121  	case basickind.Uint16:
   122  		fallthrough
   123  	case basickind.Uint32:
   124  		fallthrough
   125  	case basickind.Uint64:
   126  		switch val.(type) {
   127  		case int:
   128  		case float64:
   129  		case string:
   130  		default:
   131  			return errorx.New("not number")
   132  		}
   133  	case basickind.Float32:
   134  		fallthrough
   135  	case basickind.Float64:
   136  		switch val.(type) {
   137  		case int:
   138  		case float64:
   139  		default:
   140  		}
   141  	case basickind.String:
   142  		switch val.(type) {
   143  		case string:
   144  		default:
   145  			return errorx.New("not string")
   146  		}
   147  	}
   148  
   149  	return nil
   150  }