github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgType/Context.go (about)

     1  package kmgType
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  )
     7  
     8  type Context struct {
     9  	RootType  KmgType
    10  	RootValue reflect.Value
    11  }
    12  
    13  func NewContext(ptr interface{}) (*Context, error) {
    14  	rt := reflect.TypeOf(ptr)
    15  	if rt.Kind() != reflect.Ptr {
    16  		return nil, fmt.Errorf("NewContext need a ptr,but get %T", ptr)
    17  	}
    18  	context := &Context{}
    19  	context.RootValue = reflect.ValueOf(ptr)
    20  	et, err := TypeOf(rt)
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  	context.RootType = et
    25  	return context, nil
    26  }
    27  func (m *Context) SaveByPath(path Path, value string) (err error) {
    28  	oEv := m.RootValue
    29  	err = m.RootType.SaveByPath(&oEv, path, value)
    30  	if err != nil {
    31  		return
    32  	}
    33  	if oEv != m.RootValue {
    34  		err = fmt.Errorf("[context.SaveByPath] can not save")
    35  		return
    36  	}
    37  	return nil
    38  }
    39  
    40  func (m *Context) DeleteByPath(path Path) (err error) {
    41  	oEv := m.RootValue
    42  	err = m.RootType.DeleteByPath(&oEv, path)
    43  	if err != nil {
    44  		return
    45  	}
    46  	if oEv != m.RootValue {
    47  		err = fmt.Errorf("[context.DeleteByPath] can not save")
    48  		return
    49  	}
    50  	return nil
    51  }
    52  
    53  func (m *Context) GetElemByPath(p Path) (v reflect.Value, t KmgType, err error) {
    54  	t = m.RootType
    55  	v = m.RootValue
    56  	for _, ps := range p {
    57  		getter, ok := t.(GetElemByStringInterface)
    58  		if ok == false {
    59  			err = fmt.Errorf("[kmgType.context.GetElemByPath] some stuff in path not gettable path:%s", p)
    60  			return
    61  		}
    62  		v, t, err = getter.GetElemByString(v, ps)
    63  		if err != nil {
    64  			return
    65  		}
    66  	}
    67  	return
    68  }