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  }