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  }