path: simplify ResolveToLastNode
License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
Łukasz Magiera committed
Jul 23, 2018 at 17:37 UTC
de6a6e3e44eff6aa61ccf1586b3926929f16c794
1 file changed
+27
-19
path/resolver/resolver.go
+27
-19
@@ -70,33 +70,41 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld
70
71
for len(p) > 0 {
72
lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p)
73
- if lnk != nil {
74
- if err != nil {
75
- return nil, nil, err
76
- }
77
-
78
- next, err := lnk.GetNode(ctx, r.DAG)
79
- if err != nil {
80
- return nil, nil, err
81
- }
82
- nd = next
83
- p = rest
84
- continue
73
+ if lnk == nil {
74
+ break
75
}
76
87
- val, rest, err := nd.Resolve(p)
77
if err != nil {
78
return nil, nil, err
79
}
91
- switch val.(type) {
92
- case *ipld.Link:
93
- return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve")
94
- default:
95
- return nd, p, nil
80
+
81
+ next, err := lnk.GetNode(ctx, r.DAG)
82
+ if err != nil {
83
+ return nil, nil, err
84
}
85
+ nd = next
86
+ p = rest
87
}
88
99
- return nd, nil, nil
89
+ if len(p) == 0 {
90
+ return nd, nil, nil
91
+ }
92
+
93
+ // Confirm the path exists within the object
94
+ val, rest, err := nd.Resolve(p)
95
+ if err != nil {
96
+ return nil, nil, err
97
+ }
98
+
99
+ if len(rest) > 0 {
100
+ return nil, nil, errors.New("path failed to resolve fully")
101
+ }
102
+ switch val.(type) {
103
+ case *ipld.Link:
104
+ return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve")
105
+ default:
106
+ return nd, p, nil
107
+ }
108
}
109
110
// ResolvePath fetches the node for given path. It returns the last item