-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdeepcopy.go
77 lines (72 loc) · 2.11 KB
/
deepcopy.go
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
package json_diff
import (
"github.com/520MianXiangDuiXiang520/json-diff/decode"
"github.com/pkg/errors"
)
func copySlice(src *decode.JsonNode) (*decode.JsonNode, error) {
size := len(src.Children)
res := decode.NewSliceNode(make([]*decode.JsonNode, size), int(src.Level))
for i, child := range src.Children {
var newNode *decode.JsonNode
var err error
switch child.Type {
case decode.JsonNodeTypeSlice:
newNode, err = copySlice(child)
if err != nil {
return nil, errors.Wrapf(err, "fail to copy %dst of Slice type", i)
}
case decode.JsonNodeTypeObject:
newNode, err = copyObject(child)
if err != nil {
return nil, errors.Wrapf(err, "fail to copy %dst of Object type", i)
}
case decode.JsonNodeTypeValue:
newNode, err = copyValue(child)
if err != nil {
return nil, errors.Wrapf(err, "fail to copy %dst of Value type", i)
}
}
res.Children[i] = newNode
}
return res, nil
}
func copyValue(src *decode.JsonNode) (*decode.JsonNode, error) {
return decode.NewValueNode(src.Value, int(src.Level)), nil
}
func copyObject(src *decode.JsonNode) (*decode.JsonNode, error) {
res := decode.NewObjectNode("", map[string]*decode.JsonNode{}, int(src.Level))
for k, v := range src.ChildrenMap {
var newNode *decode.JsonNode
var err error
switch v.Type {
case decode.JsonNodeTypeObject:
newNode, err = copyObject(v)
if err != nil {
return nil, errors.Wrapf(err, "failed to copy %s of Object type", k)
}
case decode.JsonNodeTypeSlice:
newNode, err = copySlice(v)
if err != nil {
return nil, errors.Wrapf(err, "failed to copy %s of Slice type", k)
}
case decode.JsonNodeTypeValue:
newNode, err = copyValue(v)
if err != nil {
return nil, errors.Wrapf(err, "failed to copy %s of Value type", k)
}
}
res.ChildrenMap[k] = newNode
}
return res, nil
}
func DeepCopy(src *decode.JsonNode) (*decode.JsonNode, error) {
switch src.Type {
case decode.JsonNodeTypeObject:
return copyObject(src)
case decode.JsonNodeTypeSlice:
return copySlice(src)
case decode.JsonNodeTypeValue:
return copyValue(src)
}
return nil, errors.New("src has an unknown type")
}