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  }