response.go 3.1 KB
Newer Older
Y
Your Name 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
package response

import "strings"

//Response response
type Response struct {
	// root 数据
	Data interface{}
}

func (r *Response) Delete(pattern string) *Response {
	if pattern == ""{
		return r
	}
	root:=_Node{
		data:r.Data,
	}

	root.Pattern(pattern, func(node *_Node)bool {
		if node.parent ==nil {
			return false
		}
		parent:= node.parent
		switch parent.data.(type) {
		case []interface{}:
			index:= node.index
			sl:= parent.data.([]interface{})

			nl:=sl[:index]
			sl=append(nl,sl[index+1])
			parent.data = sl

		case map[string]interface{}:
			mp:=parent.data.(map[string]interface{})
			delete(mp,node.key)
		}
		return false
	})
	return r
}
//SetValue 设置目标值,如果目标不存在,会对路径进行创建
func (r *Response) SetValue(pattern string,value interface{}) {
	if pattern == ""{
		r.Data = value
		return
	}
	root:=_Node{
		data:r.Data,
	}
	root.Make(strings.Split(pattern,"."))

	root.Pattern(pattern, func(node *_Node)bool {

		if node.parent ==nil {
			return false
		}
		parent:= node.parent
		switch parent.data.(type) {
		case []interface{}:
			sl:= parent.data.([]interface{})
			index:= node.index
			sl[index] = value
			parent.data = sl

		case map[string]interface{}:
			mp:=parent.data.(map[string]interface{})
			mp[node.key]=value
		}
		return false
	})

}

//ReTarget 选择目标重新设置为root
func (r *Response) ReTarget(pattern string) {
	if pattern == ""{
		return
	}
	root:=_Node{
		data:r.Data,
	}

	match, _ := root.Pattern(pattern, func(node *_Node) bool {
		r.Data = node.data

		return true
	})
	if !match{
		r.Data = make(map[string]interface{})
	}
	return
}
//Group
func (r *Response) Group(path []string) {
	l:=len(path)
	if l==0{
		return
	}
	root := make(map[string]interface{})
	node:=root

	lastKey := path[l-1]
	if l>1{
		for _,key:=range path[:l-1]{
			v := make(map[string]interface{})
			node[key]=v
			node = v
		}
	}

	node[lastKey] = r.Data
	r.Data = root
}
//ReName 重命名
func (r *Response)ReName(pattern string,newName string)  {
	if pattern == ""{
		return
	}
	root:=_Node{
		data:r.Data,
	}

	root.Pattern(pattern, func(node *_Node) bool {
		if node.parent ==nil {
			return false
		}
		parent:= node.parent
		switch parent.data.(type) {
		case []interface{}:
			return false

		case map[string]interface{}:
			mp:=parent.data.(map[string]interface{})
			delete(mp,node.key)
			mp[newName]=node.data
			return false
		}
		return false
	})
}

func (r *Response)Move(source ,target string)  {

	if strings.Index(source,"*") != -1{
		return
	}
	if strings.Index(target,"*") != -1{
		return
	}
	root:=_Node{
		data:r.Data,
	}
	var oldValues *_Node
	match,_:=root.Pattern(source, func(node *_Node) bool {
		oldValues = node

		if node.parent ==nil {
			return false
		}
		parent:= node.parent
		switch parent.data.(type) {
		case []interface{}:
			index:= node.index
			sl:= parent.data.([]interface{})

			nl:=sl[:index]
			sl=append(nl,sl[index+1])
			parent.data = sl

		case map[string]interface{}:
			mp:=parent.data.(map[string]interface{})
			delete(mp,node.key)
		}
		return false
	})
	if match{
	 	r.SetValue(target,oldValues.data)
	}else{
		r.SetValue(target,nil)
	}

}