/
list.go
88 lines (82 loc) · 1.92 KB
/
list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package local
import (
"context"
"errors"
"fmt"
"path/filepath"
"github.com/ipfs/go-cid"
pb "github.com/textileio/textile/v2/api/bucketsd/pb"
)
var errEmptyItem = fmt.Errorf("item is empty")
// BucketItem describes an item (file/directory) in a bucket.
type BucketItem struct {
Cid cid.Cid `json:"cid"`
Name string `json:"name"`
Path string `json:"path"`
Size int64 `json:"size"`
IsDir bool `json:"is_dir"`
Items []BucketItem `json:"items"`
ItemsCount int `json:"items_count"`
}
// ListRemotePath returns a list of all bucket items under path.
func (b *Bucket) ListRemotePath(ctx context.Context, pth string) (items []BucketItem, err error) {
pth = filepath.ToSlash(pth)
if pth == "." || pth == "/" || pth == "./" {
pth = ""
}
ctx, err = b.Context(ctx)
if err != nil {
return
}
rep, err := b.clients.Buckets.ListPath(ctx, b.Key(), pth)
if err != nil {
return
}
if len(rep.Item.Items) > 0 {
items = make([]BucketItem, len(rep.Item.Items))
for j, k := range rep.Item.Items {
ii, err := pbItemToItem(k)
if err != nil {
return items, err
}
items[j] = ii
}
} else if !rep.Item.IsDir {
items = make([]BucketItem, 1)
item, err := pbItemToItem(rep.Item)
if err != nil {
return items, err
}
items[0] = item
}
return items, nil
}
func pbItemToItem(pi *pb.PathItem) (item BucketItem, err error) {
if pi.Cid == "" {
return item, errEmptyItem
}
c, err := cid.Decode(pi.Cid)
if err != nil {
return
}
items := make([]BucketItem, len(pi.Items))
for j, k := range pi.Items {
ii, err := pbItemToItem(k)
if errors.Is(err, errEmptyItem) {
items = nil
break
} else if err != nil {
return item, err
}
items[j] = ii
}
return BucketItem{
Cid: c,
Name: pi.Name,
Path: pi.Path,
Size: pi.Size,
IsDir: pi.IsDir,
Items: items,
ItemsCount: int(pi.ItemsCount),
}, nil
}