github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/typeTransform/StringTransformSubType.go (about) 1 package typeTransform 2 3 import ( 4 "fmt" 5 "reflect" 6 7 "github.com/bronze1man/kmg/kmgReflect" 8 ) 9 10 /* 11 transform some string on some sub type base on type full name 12 can be general by callback base on type 13 all value must exist in that transformTable 14 specal case: 15 1."" -> "" 16 */ 17 func StringTransformSubType(in interface{}, transformTable map[string]map[string]string) (err error) { 18 return stringTransformSubType(reflect.ValueOf(in), transformTable) 19 } 20 func stringTransformSubType(in reflect.Value, transformTable map[string]map[string]string) (err error) { 21 switch in.Kind() { 22 case reflect.String: 23 typeName := kmgReflect.GetTypeFullName(in.Type()) 24 thisTable, exist := transformTable[typeName] 25 if !exist { 26 return 27 } 28 inS := in.String() 29 if inS == "" { 30 in.SetString("") 31 return 32 } 33 oVal, exist := thisTable[inS] 34 if !exist { 35 return fmt.Errorf(`string transform fail! from:"%s",type:"%s"`, inS, typeName) 36 } 37 in.SetString(oVal) 38 return 39 case reflect.Ptr: 40 return stringTransformSubType(in.Elem(), transformTable) 41 case reflect.Slice: 42 len := in.Len() 43 for i := 0; i < len; i++ { 44 err = stringTransformSubType(in.Index(i), transformTable) 45 if err != nil { 46 return 47 } 48 } 49 case reflect.Struct: 50 len := in.Type().NumField() 51 for i := 0; i < len; i++ { 52 err = stringTransformSubType(in.Field(i), transformTable) 53 if err != nil { 54 return 55 } 56 } 57 } 58 return 59 }