mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-21 18:37:45 +08:00
coreapi: move path impl to path.go
License: MIT Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
This commit is contained in:
parent
338e90e9c8
commit
4f6c0666ea
@ -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 }
|
||||
|
||||
109
core/coreapi/path.go
Normal file
109
core/coreapi/path.go
Normal file
@ -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 }
|
||||
Loading…
Reference in New Issue
Block a user