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 }