Example #1
0
// allowSetStat 是否允许修改readonly组的值。
func (opt *Options) setValue(key string, val interface{}, allowSetReadonly bool) error {
	v := reflect.ValueOf(opt)
	v = v.Elem()
	t := v.Type()
	for i := 0; i < t.NumField(); i++ {
		tags := t.Field(i).Tag.Get("options")
		keys := strings.Split(tags, ",")
		if keys[1] == key {
			if keys[0] != "readonly" || allowSetReadonly {
				return conv.Value(val, v.Field(i))
			}
			return errors.New("该值不能被修改")
		}
	}
	return nil
}
Example #2
0
// 将一个map数组中的数据导入到当前的options中
//  {"group":"system", "key":"pageSize", "value":"5"} ==> options.PageSize=5
func (opt *Options) fromMaps(maps []map[string]string) error {
	v := reflect.ValueOf(opt)
	v = v.Elem()
	t := v.Type()
	m := make(map[string]reflect.Value, t.NumField())
	for i := 0; i < t.NumField(); i++ {
		tags := t.Field(i).Tag.Get("options")
		m[tags] = v.Field(i)
	}

	for _, item := range maps {
		obj, found := m[item["group"]+","+item["key"]]
		if !found {
			continue
		}
		if err := conv.Value(item["value"], obj); err != nil {
			return err
		}
	}
	return nil
}