package coreapi import ( context "context" fmt "fmt" gopath "path" core "github.com/ipfs/go-ipfs/core" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" namesys "github.com/ipfs/go-ipfs/namesys" ipfspath "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path" resolver "gx/ipfs/QmPqCBrmkm7jNfYi7xFS7mUZsrN6DEumBMrxLnL7axNJx1/go-path/resolver" uio "gx/ipfs/Qmdqe1sKBpz6W8xFDptGfmzgCPQ5CXNuQPhZeELqMowgsQ/go-unixfs/io" cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) // ResolveNode resolves the path `p` using Unixfs resolver, gets and returns the // resolved Node. func (api *CoreAPI) ResolveNode(ctx context.Context, p coreiface.Path) (ipld.Node, error) { return resolveNode(ctx, api.node.DAG, api.node.Namesys, p) } // ResolvePath resolves the path `p` using Unixfs resolver, returns the // resolved path. func (api *CoreAPI) ResolvePath(ctx context.Context, p coreiface.Path) (coreiface.ResolvedPath, error) { return resolvePath(ctx, api.node.DAG, api.node.Namesys, p) } func resolveNode(ctx context.Context, ng ipld.NodeGetter, nsys namesys.NameSystem, p coreiface.Path) (ipld.Node, error) { rp, err := resolvePath(ctx, ng, nsys, p) if err != nil { return nil, err } node, err := ng.Get(ctx, rp.Cid()) if err != nil { return nil, err } return node, nil } func resolvePath(ctx context.Context, ng ipld.NodeGetter, nsys namesys.NameSystem, p coreiface.Path) (coreiface.ResolvedPath, error) { if _, ok := p.(coreiface.ResolvedPath); ok { return p.(coreiface.ResolvedPath), nil } ipath := ipfspath.Path(p.String()) ipath, err := core.ResolveIPNS(ctx, nsys, ipath) if err == core.ErrNoNamesys { return nil, coreiface.ErrOffline } else if err != nil { return nil, err } var resolveOnce resolver.ResolveOnce switch ipath.Segments()[0] { case "ipfs": resolveOnce = uio.ResolveUnixfsOnce case "ipld": resolveOnce = resolver.ResolveSingle default: return nil, fmt.Errorf("unsupported path namespace: %s", p.Namespace()) } r := &resolver.Resolver{ DAG: ng, ResolveOnce: resolveOnce, } node, rest, err := r.ResolveToLastNode(ctx, ipath) if err != nil { return nil, err } root, err := cid.Parse(ipath.Segments()[1]) if err != nil { return nil, err } return coreiface.NewResolvedPath(ipath, node, root, gopath.Join(rest...)), nil }