github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgType/type.go (about) 1 package kmgType 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 type FromStringInterface interface { 9 FromString(s string) (reflect.Value, error) 10 } 11 type ToStringInterface interface { 12 ToString(v reflect.Value) string //is caller responsibility to ensure v is callee Type 13 } 14 type StringConverterInterface interface { 15 FromStringInterface 16 ToStringInterface 17 } 18 19 //array slice struct map 20 type GetElemByStringInterface interface { 21 GetElemByString(v reflect.Value, k string) (reflect.Value, KmgType, error) 22 } 23 24 //bool datetime fkref float int string stringEnum 25 type SaveScaleInterface interface { 26 SaveScale(v reflect.Value, value string) error 27 } 28 29 type EditableByPathInterface interface { 30 // v must not be nil, v.IsValid must be true 31 // every type must consider reflect.Value.CanSet() 32 // every type in the path except least one(include ptr),must eat a path. 33 // try best to create all path, if it is not exist. 34 // if this value can set its own value,set it,if this value can not set its own value,replace v with a new value 35 SaveByPath(v *reflect.Value, path Path, value string) (err error) 36 DeleteByPath(v *reflect.Value, path Path) (err error) 37 } 38 39 type KmgType interface { 40 EditableByPathInterface 41 ReflectTypeGetter 42 } 43 type KmgTypeAndToStringInterface interface { 44 KmgType 45 ToStringInterface 46 } 47 48 type ReflectTypeGetter interface { 49 GetReflectType() reflect.Type 50 } 51 52 type GetElemByStringAndReflectTypeGetterInterface interface { 53 GetElemByStringInterface 54 ReflectTypeGetter 55 } 56 57 func TypeOf(rt reflect.Type) (KmgType, error) { 58 switch rt { 59 case DateTimeReflectType: 60 t := &DateTimeType{reflectTypeGetterImp: reflectTypeGetterImp{rt}} 61 t.saveScaleFromStringer = saveScaleFromStringer{t, t} 62 t.saveScaleEditabler = saveScaleEditabler{t, t} 63 return t, nil 64 } 65 66 switch rt.Kind() { 67 case reflect.Ptr: 68 t := &PtrType{reflectTypeGetterImp: reflectTypeGetterImp{rt}} 69 return t, nil 70 case reflect.Bool: 71 t := &BoolType{ 72 reflectTypeGetterImp: reflectTypeGetterImp{rt}, 73 } 74 t.saveScaleFromStringer = saveScaleFromStringer{t, t} 75 t.saveScaleEditabler = saveScaleEditabler{t, t} 76 return t, nil 77 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, 78 reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, 79 reflect.Uintptr: 80 t := &IntType{ 81 reflectTypeGetterImp: reflectTypeGetterImp{rt}, 82 } 83 t.saveScaleFromStringer = saveScaleFromStringer{t, t} 84 t.saveScaleEditabler = saveScaleEditabler{t, t} 85 return t, nil 86 case reflect.Float32, reflect.Float64: 87 t := &FloatType{ 88 reflectTypeGetterImp: reflectTypeGetterImp{rt}, 89 } 90 t.saveScaleFromStringer = saveScaleFromStringer{t, t} 91 t.saveScaleEditabler = saveScaleEditabler{t, t} 92 return t, nil 93 case reflect.String: 94 t := &StringType{ 95 reflectTypeGetterImp: reflectTypeGetterImp{rt}, 96 } 97 t.saveScaleFromStringer = saveScaleFromStringer{t, t} 98 t.saveScaleEditabler = saveScaleEditabler{t, t} 99 return t, nil 100 case reflect.Array: 101 t := &ArrayType{ 102 reflectTypeGetterImp: reflectTypeGetterImp{rt}, 103 } 104 t.getElemByStringEditorabler = getElemByStringEditorabler{t, t} 105 return t, nil 106 case reflect.Slice: 107 t := &SliceType{ 108 reflectTypeGetterImp: reflectTypeGetterImp{rt}, 109 } 110 t.getElemByStringEditorabler = getElemByStringEditorabler{t, t} 111 return t, nil 112 case reflect.Map: 113 t := &MapType{ 114 reflectTypeGetterImp: reflectTypeGetterImp{rt}, 115 } 116 return t, nil 117 case reflect.Struct: 118 t := &StructType{ 119 reflectTypeGetterImp: reflectTypeGetterImp{rt}, 120 } 121 t.getElemByStringEditorabler = getElemByStringEditorabler{t, t} 122 return t, nil 123 default: 124 return nil, fmt.Errorf("not support type kind: %s", rt.Kind().String()) 125 } 126 }