diff --git a/core/coreapi/coreapi.go b/core/coreapi/coreapi.go index 71aa8e75f..151f1fe34 100644 --- a/core/coreapi/coreapi.go +++ b/core/coreapi/coreapi.go @@ -14,18 +14,9 @@ Interfaces here aren't yet completely stable. package coreapi import ( - "context" - core "github.com/ipfs/go-ipfs/core" coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" caopts "github.com/ipfs/go-ipfs/core/coreapi/interface/options" - namesys "github.com/ipfs/go-ipfs/namesys" - ipfspath "github.com/ipfs/go-ipfs/path" - resolver "github.com/ipfs/go-ipfs/path/resolver" - uio "github.com/ipfs/go-ipfs/unixfs/io" - - cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid" - ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format" ) type CoreAPI struct { @@ -73,96 +64,3 @@ func (api *CoreAPI) Object() coreiface.ObjectAPI { func (api *CoreAPI) Pin() coreiface.PinAPI { return (*PinAPI)(api) } - -// ResolveNode resolves the path `p` using Unixfx 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) -} - -func resolveNode(ctx context.Context, ng ipld.NodeGetter, nsys namesys.NameSystem, p coreiface.Path) (ipld.Node, error) { - p, err := resolvePath(ctx, ng, nsys, p) - if err != nil { - return nil, err - } - - node, err := ng.Get(ctx, p.Cid()) - if err != nil { - return nil, err - } - return node, nil -} - -// ResolvePath resolves the path `p` using Unixfs resolver, returns the -// resolved path. -// TODO: store all of ipfspath.Resolver.ResolvePathComponents() in Path -func (api *CoreAPI) ResolvePath(ctx context.Context, p coreiface.Path) (coreiface.Path, error) { - return resolvePath(ctx, api.node.DAG, api.node.Namesys, p) -} - -func resolvePath(ctx context.Context, ng ipld.NodeGetter, nsys namesys.NameSystem, p coreiface.Path) (coreiface.Path, error) { - if p.Resolved() { - return p, nil - } - - r := &resolver.Resolver{ - DAG: ng, - ResolveOnce: uio.ResolveUnixfsOnce, - } - - p2 := ipfspath.FromString(p.String()) - node, err := core.Resolve(ctx, nsys, r, p2) - if err == core.ErrNoNamesys { - return nil, coreiface.ErrOffline - } else if err != nil { - return nil, err - } - - var root *cid.Cid - if p2.IsJustAKey() { - root = node.Cid() - } - - return ResolvedPath(p.String(), node.Cid(), root), nil -} - -// Implements coreiface.Path -type path struct { - path ipfspath.Path - cid *cid.Cid - root *cid.Cid -} - -// ParsePath parses path `p` using ipfspath parser, returns the parsed path. -func (api *CoreAPI) ParsePath(ctx context.Context, p string, opts ...caopts.ParsePathOption) (coreiface.Path, error) { - options, err := caopts.ParsePathOptions(opts...) - if err != nil { - return nil, err - } - - pp, err := ipfspath.ParsePath(p) - if err != nil { - return nil, err - } - - res := &path{path: pp} - if options.Resolve { - return api.ResolvePath(ctx, res) - } - return res, nil -} - -// ParseCid parses the path from `c`, returns the parsed path. -func (api *CoreAPI) ParseCid(c *cid.Cid) coreiface.Path { - return &path{path: ipfspath.FromCid(c), cid: c, root: c} -} - -// ResolvePath parses path from string `p`, returns parsed path. -func ResolvedPath(p string, c *cid.Cid, r *cid.Cid) coreiface.Path { - return &path{path: ipfspath.FromString(p), cid: c, root: r} -} - -func (p *path) String() string { return p.path.String() } -func (p *path) Cid() *cid.Cid { return p.cid } -func (p *path) Root() *cid.Cid { return p.root } -func (p *path) Resolved() bool { return p.cid != nil } diff --git a/core/coreapi/path.go b/core/coreapi/path.go new file mode 100644 index 000000000..ebfb33733 --- /dev/null +++ b/core/coreapi/path.go @@ -0,0 +1,109 @@ +package coreapi + +import ( + "context" + + core "github.com/ipfs/go-ipfs/core" + coreiface "github.com/ipfs/go-ipfs/core/coreapi/interface" + caopts "github.com/ipfs/go-ipfs/core/coreapi/interface/options" + namesys "github.com/ipfs/go-ipfs/namesys" + ipfspath "github.com/ipfs/go-ipfs/path" + resolver "github.com/ipfs/go-ipfs/path/resolver" + uio "github.com/ipfs/go-ipfs/unixfs/io" + + ipld "gx/ipfs/QmWi2BYBL5gJ3CiAiQchg6rn1A8iBsrWy51EYxvHVjFvLb/go-ipld-format" + cid "gx/ipfs/QmapdYm1b22Frv3k17fqrBYTFRxwiaVJkB299Mfn33edeB/go-cid" +) + +// ResolveNode resolves the path `p` using Unixfx 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) +} + +func resolveNode(ctx context.Context, ng ipld.NodeGetter, nsys namesys.NameSystem, p coreiface.Path) (ipld.Node, error) { + p, err := resolvePath(ctx, ng, nsys, p) + if err != nil { + return nil, err + } + + node, err := ng.Get(ctx, p.Cid()) + if err != nil { + return nil, err + } + return node, nil +} + +// ResolvePath resolves the path `p` using Unixfs resolver, returns the +// resolved path. +// TODO: store all of ipfspath.Resolver.ResolvePathComponents() in Path +func (api *CoreAPI) ResolvePath(ctx context.Context, p coreiface.Path) (coreiface.Path, error) { + return resolvePath(ctx, api.node.DAG, api.node.Namesys, p) +} + +func resolvePath(ctx context.Context, ng ipld.NodeGetter, nsys namesys.NameSystem, p coreiface.Path) (coreiface.Path, error) { + if p.Resolved() { + return p, nil + } + + r := &resolver.Resolver{ + DAG: ng, + ResolveOnce: uio.ResolveUnixfsOnce, + } + + p2 := ipfspath.FromString(p.String()) + node, err := core.Resolve(ctx, nsys, r, p2) + if err == core.ErrNoNamesys { + return nil, coreiface.ErrOffline + } else if err != nil { + return nil, err + } + + var root *cid.Cid + if p2.IsJustAKey() { + root = node.Cid() + } + + return ResolvedPath(p.String(), node.Cid(), root), nil +} + +// Implements coreiface.Path +type path struct { + path ipfspath.Path + cid *cid.Cid + root *cid.Cid +} + +// ParsePath parses path `p` using ipfspath parser, returns the parsed path. +func (api *CoreAPI) ParsePath(ctx context.Context, p string, opts ...caopts.ParsePathOption) (coreiface.Path, error) { + options, err := caopts.ParsePathOptions(opts...) + if err != nil { + return nil, err + } + + pp, err := ipfspath.ParsePath(p) + if err != nil { + return nil, err + } + + res := &path{path: pp} + if options.Resolve { + return api.ResolvePath(ctx, res) + } + return res, nil +} + +// ParseCid parses the path from `c`, retruns the parsed path. +func (api *CoreAPI) ParseCid(c *cid.Cid) coreiface.Path { + return &path{path: ipfspath.FromCid(c), cid: c, root: c} +} + +// ResolvePath parses path from string `p`, returns parsed path. +func ResolvedPath(p string, c *cid.Cid, r *cid.Cid) coreiface.Path { + return &path{path: ipfspath.FromString(p), cid: c, root: r} +} + +func (p *path) String() string { return p.path.String() } +func (p *path) Cid() *cid.Cid { return p.cid } +func (p *path) Root() *cid.Cid { return p.root } +func (p *path) Resolved() bool { return p.cid != nil }