github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgType/SliceType.go (about) 1 package kmgType 2 3 import ( 4 "fmt" 5 "reflect" 6 "strconv" 7 ) 8 9 //path -> slice index(number) 10 type SliceType struct { 11 reflectTypeGetterImp 12 getElemByStringEditorabler 13 elemType KmgType 14 } 15 16 func (t *SliceType) init() (err error) { 17 if t.elemType != nil { 18 return 19 } 20 t.elemType, err = TypeOf(t.GetReflectType().Elem()) 21 return 22 } 23 func (t *SliceType) GetElemByString(v reflect.Value, k string) (ev reflect.Value, et KmgType, err error) { 24 if err = t.init(); err != nil { 25 return 26 } 27 et = t.elemType 28 ev, err = arrayGetSubValueByString(v, k) 29 if err != nil { 30 return 31 } 32 return 33 } 34 func (t *SliceType) SaveByPath(v *reflect.Value, path Path, value string) (err error) { 35 if err = t.init(); err != nil { 36 return 37 } 38 if len(path) > 0 && path[0] == "" { 39 if v.CanSet() { 40 v.Set( 41 reflect.Append(*v, reflect.New(t.elemType.GetReflectType()).Elem()), 42 ) 43 } else { 44 *v = reflect.Append(*v, reflect.New(t.elemType.GetReflectType()).Elem()) 45 } 46 path[0] = strconv.Itoa(v.Len() - 1) 47 if value == "" { 48 return 49 } 50 } 51 return t.getElemByStringEditorabler.SaveByPath(v, path, value) 52 } 53 54 func (t *SliceType) DeleteByPath(v *reflect.Value, path Path) (err error) { 55 if err = t.init(); err != nil { 56 return 57 } 58 if len(path) > 1 { 59 return passThougthDeleteByPath(t, v, path) 60 } else if len(path) == 0 { 61 return fmt.Errorf("[SliceType.DeleteByPath] delete from slice with no path.") 62 } 63 i, err := arrayParseKey(*v, path[0]) 64 if err != nil { 65 return err 66 } 67 if v.CanSet() { 68 v.Set( 69 reflect.AppendSlice(v.Slice(0, i), v.Slice(i+1, v.Len())), 70 ) 71 } else { 72 *v = reflect.AppendSlice(v.Slice(0, i), v.Slice(i+1, v.Len())) 73 } 74 return nil 75 }