From de6a6e3e44eff6aa61ccf1586b3926929f16c794 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= <magik6k@gmail.com> Date: Mon, 23 Jul 2018 17:37:33 +0200 Subject: [PATCH] path: simplify ResolveToLastNode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit License: MIT Signed-off-by: Ćukasz Magiera <magik6k@gmail.com> --- path/resolver/resolver.go | 46 +++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/path/resolver/resolver.go b/path/resolver/resolver.go index e7a95a83e..7bd8caff9 100644 --- a/path/resolver/resolver.go +++ b/path/resolver/resolver.go @@ -70,33 +70,41 @@ func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (ipld for len(p) > 0 { lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) - if lnk != nil { - if err != nil { - return nil, nil, err - } - - next, err := lnk.GetNode(ctx, r.DAG) - if err != nil { - return nil, nil, err - } - nd = next - p = rest - continue + if lnk == nil { + break } - val, rest, err := nd.Resolve(p) if err != nil { return nil, nil, err } - switch val.(type) { - case *ipld.Link: - return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") - default: - return nd, p, nil + + next, err := lnk.GetNode(ctx, r.DAG) + if err != nil { + return nil, nil, err } + nd = next + p = rest } - return nd, nil, nil + if len(p) == 0 { + return nd, nil, nil + } + + // Confirm the path exists within the object + val, rest, err := nd.Resolve(p) + if err != nil { + return nil, nil, err + } + + if len(rest) > 0 { + return nil, nil, errors.New("path failed to resolve fully") + } + switch val.(type) { + case *ipld.Link: + return nil, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") + default: + return nd, p, nil + } } // ResolvePath fetches the node for given path. It returns the last item