response.go 3.2 KB
Newer Older
Y
Your Name 已提交
1 2 3 4 5 6 7 8 9 10
package response

import "strings"

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

Y
Your Name 已提交
11
//Delete delete
Y
Your Name 已提交
12
func (r *Response) Delete(pattern string) *Response {
Y
Your Name 已提交
13
	if pattern == "" {
Y
Your Name 已提交
14 15
		return r
	}
Y
Your Name 已提交
16 17
	root := _Node{
		data: r.Data,
Y
Your Name 已提交
18 19
	}

Y
Your Name 已提交
20 21
	root.Pattern(pattern, func(node *_Node) bool {
		if node.parent == nil {
Y
Your Name 已提交
22 23
			return false
		}
Y
Your Name 已提交
24
		parent := node.parent
Y
Your Name 已提交
25 26
		switch parent.data.(type) {
		case []interface{}:
Y
Your Name 已提交
27 28
			index := node.index
			sl := parent.data.([]interface{})
Y
Your Name 已提交
29

Y
Your Name 已提交
30 31
			nl := sl[:index]
			sl = append(nl, sl[index+1])
Y
Your Name 已提交
32 33 34
			parent.data = sl

		case map[string]interface{}:
Y
Your Name 已提交
35 36
			mp := parent.data.(map[string]interface{})
			delete(mp, node.key)
Y
Your Name 已提交
37 38 39 40 41
		}
		return false
	})
	return r
}
Y
Your Name 已提交
42

Y
Your Name 已提交
43
//SetValue 设置目标值,如果目标不存在,会对路径进行创建
Y
Your Name 已提交
44 45
func (r *Response) SetValue(pattern string, value interface{}) {
	if pattern == "" {
Y
Your Name 已提交
46 47 48
		r.Data = value
		return
	}
Y
Your Name 已提交
49 50
	root := _Node{
		data: r.Data,
Y
Your Name 已提交
51
	}
Y
Your Name 已提交
52
	root.Make(strings.Split(pattern, "."))
Y
Your Name 已提交
53

Y
Your Name 已提交
54
	root.Pattern(pattern, func(node *_Node) bool {
Y
Your Name 已提交
55

Y
Your Name 已提交
56
		if node.parent == nil {
Y
Your Name 已提交
57 58
			return false
		}
Y
Your Name 已提交
59
		parent := node.parent
Y
Your Name 已提交
60 61
		switch parent.data.(type) {
		case []interface{}:
Y
Your Name 已提交
62 63
			sl := parent.data.([]interface{})
			index := node.index
Y
Your Name 已提交
64 65 66 67
			sl[index] = value
			parent.data = sl

		case map[string]interface{}:
Y
Your Name 已提交
68 69
			mp := parent.data.(map[string]interface{})
			mp[node.key] = value
Y
Your Name 已提交
70 71 72 73 74 75 76 77
		}
		return false
	})

}

//ReTarget 选择目标重新设置为root
func (r *Response) ReTarget(pattern string) {
Y
Your Name 已提交
78
	if pattern == "" {
Y
Your Name 已提交
79 80
		return
	}
Y
Your Name 已提交
81 82
	root := _Node{
		data: r.Data,
Y
Your Name 已提交
83 84 85 86 87 88 89
	}

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

		return true
	})
Y
Your Name 已提交
90
	if !match {
Y
Your Name 已提交
91 92 93 94
		r.Data = make(map[string]interface{})
	}
	return
}
Y
Your Name 已提交
95 96

//Group group
Y
Your Name 已提交
97
func (r *Response) Group(path []string) {
Y
Your Name 已提交
98 99
	l := len(path)
	if l == 0 {
Y
Your Name 已提交
100 101 102
		return
	}
	root := make(map[string]interface{})
Y
Your Name 已提交
103
	node := root
Y
Your Name 已提交
104 105

	lastKey := path[l-1]
Y
Your Name 已提交
106 107
	if l > 1 {
		for _, key := range path[:l-1] {
Y
Your Name 已提交
108
			v := make(map[string]interface{})
Y
Your Name 已提交
109
			node[key] = v
Y
Your Name 已提交
110 111 112 113 114 115 116
			node = v
		}
	}

	node[lastKey] = r.Data
	r.Data = root
}
Y
Your Name 已提交
117

Y
Your Name 已提交
118
//ReName 重命名
Y
Your Name 已提交
119 120
func (r *Response) ReName(pattern string, newName string) {
	if pattern == "" {
Y
Your Name 已提交
121 122
		return
	}
Y
Your Name 已提交
123 124
	root := _Node{
		data: r.Data,
Y
Your Name 已提交
125 126 127
	}

	root.Pattern(pattern, func(node *_Node) bool {
Y
Your Name 已提交
128
		if node.parent == nil {
Y
Your Name 已提交
129 130
			return false
		}
Y
Your Name 已提交
131
		parent := node.parent
Y
Your Name 已提交
132 133 134 135 136
		switch parent.data.(type) {
		case []interface{}:
			return false

		case map[string]interface{}:
Y
Your Name 已提交
137 138 139
			mp := parent.data.(map[string]interface{})
			delete(mp, node.key)
			mp[newName] = node.data
Y
Your Name 已提交
140 141 142 143 144 145
			return false
		}
		return false
	})
}

Y
Your Name 已提交
146 147
//Move move
func (r *Response) Move(source, target string) {
Y
Your Name 已提交
148

Y
Your Name 已提交
149
	if strings.Index(source, "*") != -1 {
Y
Your Name 已提交
150 151
		return
	}
Y
Your Name 已提交
152
	if strings.Index(target, "*") != -1 {
Y
Your Name 已提交
153 154
		return
	}
Y
Your Name 已提交
155 156
	root := _Node{
		data: r.Data,
Y
Your Name 已提交
157 158
	}
	var oldValues *_Node
Y
Your Name 已提交
159
	match, _ := root.Pattern(source, func(node *_Node) bool {
Y
Your Name 已提交
160 161
		oldValues = node

Y
Your Name 已提交
162
		if node.parent == nil {
Y
Your Name 已提交
163 164
			return false
		}
Y
Your Name 已提交
165
		parent := node.parent
Y
Your Name 已提交
166 167
		switch parent.data.(type) {
		case []interface{}:
Y
Your Name 已提交
168 169
			index := node.index
			sl := parent.data.([]interface{})
Y
Your Name 已提交
170

Y
Your Name 已提交
171 172
			nl := sl[:index]
			sl = append(nl, sl[index+1])
Y
Your Name 已提交
173 174 175
			parent.data = sl

		case map[string]interface{}:
Y
Your Name 已提交
176 177
			mp := parent.data.(map[string]interface{})
			delete(mp, node.key)
Y
Your Name 已提交
178 179 180
		}
		return false
	})
Y
Your Name 已提交
181 182 183 184
	if match {
		r.SetValue(target, oldValues.data)
	} else {
		r.SetValue(target, nil)
Y
Your Name 已提交
185 186
	}

Y
Your Name 已提交
187
}