1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-07-15 07:58:15 +08:00
Files
kubo/unixfs/io/resolve.go
Jeromy 1de040d0b7 Use a bitswap session for 'Cat'
License: MIT
Signed-off-by: Jeromy <jeromyj@gmail.com>
2018-02-02 12:25:20 -08:00

59 lines
1.3 KiB
Go

package io
import (
"context"
dag "github.com/ipfs/go-ipfs/merkledag"
ft "github.com/ipfs/go-ipfs/unixfs"
hamt "github.com/ipfs/go-ipfs/unixfs/hamt"
ipld "gx/ipfs/Qme5bWv7wtjUNGsK2BNGVUFPKiuxWrsqrtvYwCLRw8YFES/go-ipld-format"
)
// ResolveUnixfsOnce resolves a single hop of a path through a graph in a
// unixfs context. This includes handling traversing sharded directories.
func ResolveUnixfsOnce(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) {
switch nd := nd.(type) {
case *dag.ProtoNode:
upb, err := ft.FromBytes(nd.Data())
if err != nil {
// Not a unixfs node, use standard object traversal code
lnk, err := nd.GetNodeLink(names[0])
if err != nil {
return nil, nil, err
}
return lnk, names[1:], nil
}
switch upb.GetType() {
case ft.THAMTShard:
rods := dag.NewReadOnlyDagService(ds)
s, err := hamt.NewHamtFromDag(rods, nd)
if err != nil {
return nil, nil, err
}
out, err := s.Find(ctx, names[0])
if err != nil {
return nil, nil, err
}
return out, names[1:], nil
default:
lnk, err := nd.GetNodeLink(names[0])
if err != nil {
return nil, nil, err
}
return lnk, names[1:], nil
}
default:
lnk, rest, err := nd.ResolveLink(names)
if err != nil {
return nil, nil, err
}
return lnk, rest, nil
}
}