add partial resolving to resolver code
License: MIT Signed-off-by: Jeromy <why@ipfs.io>
Jeromy committed
Dec 10, 2016 at 11:25 UTC
9d8a4afd75a9029ea7b1cc32fdfb8b9e0310dbd3
2 files changed
+45
-2
core/commands/dag/dag.go
+12
-2
@@ -137,13 +137,23 @@ var DagGetCmd = &cmds.Command{
137
return
138
}
139
140
- obj, err := n.Resolver.ResolvePath(req.Context(), p)
140
+ obj, rem, err := n.Resolver.ResolveToLastNode(req.Context(), p)
141
if err != nil {
142
res.SetError(err, cmds.ErrNormal)
143
return
144
}
145
146
- res.SetOutput(obj)
146
+ var out interface{} = obj
147
+ if len(rem) > 0 {
148
+ final, _, err := obj.Resolve(rem)
149
+ if err != nil {
150
+ res.SetError(err, cmds.ErrNormal)
151
+ return
152
+ }
153
+ out = final
154
+ }
155
+
156
+ res.SetOutput(out)
157
},
158
}
159
path/resolver.go
+33
@@ -73,6 +73,39 @@ func SplitAbsPath(fpath Path) (*cid.Cid, []string, error) {
73
return c, parts[1:], nil
74
}
75
76
+func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath Path) (node.Node, []string, error) {
77
+ c, p, err := SplitAbsPath(fpath)
78
+ if err != nil {
79
+ return nil, nil, err
80
+ }
81
+
82
+ nd, err := r.DAG.Get(ctx, c)
83
+ if err != nil {
84
+ return nil, nil, err
85
+ }
86
+
87
+ for len(p) > 0 {
88
+ val, rest, err := nd.Resolve(p)
89
+ if err != nil {
90
+ return nil, nil, err
91
+ }
92
+
93
+ switch val := val.(type) {
94
+ case *node.Link:
95
+ next, err := val.GetNode(ctx, r.DAG)
96
+ if err != nil {
97
+ return nil, nil, err
98
+ }
99
+ nd = next
100
+ p = rest
101
+ default:
102
+ return nd, p, nil
103
+ }
104
+ }
105
+
106
+ return nd, nil, nil
107
+}
108
+
109
// ResolvePath fetches the node for given path. It returns the last item
110
// returned by ResolvePathComponents.
111
func (s *Resolver) ResolvePath(ctx context.Context, fpath Path) (node.Node, error) {