OSDN Git Service

add package
[bytom/vapor.git] / vendor / github.com / ipfs / go-ipfs-files / slicedirectory.go
diff --git a/vendor/github.com/ipfs/go-ipfs-files/slicedirectory.go b/vendor/github.com/ipfs/go-ipfs-files/slicedirectory.go
new file mode 100644 (file)
index 0000000..d116562
--- /dev/null
@@ -0,0 +1,97 @@
+package files
+
+import "sort"
+
+type fileEntry struct {
+       name string
+       file Node
+}
+
+func (e fileEntry) Name() string {
+       return e.name
+}
+
+func (e fileEntry) Node() Node {
+       return e.file
+}
+
+func FileEntry(name string, file Node) DirEntry {
+       return fileEntry{
+               name: name,
+               file: file,
+       }
+}
+
+type sliceIterator struct {
+       files []DirEntry
+       n     int
+}
+
+func (it *sliceIterator) Name() string {
+       return it.files[it.n].Name()
+}
+
+func (it *sliceIterator) Node() Node {
+       return it.files[it.n].Node()
+}
+
+func (it *sliceIterator) Next() bool {
+       it.n++
+       return it.n < len(it.files)
+}
+
+func (it *sliceIterator) Err() error {
+       return nil
+}
+
+// SliceFile implements Node, and provides simple directory handling.
+// It contains children files, and is created from a `[]Node`.
+// SliceFiles are always directories, and can't be read from or closed.
+type SliceFile struct {
+       files []DirEntry
+}
+
+func NewMapDirectory(f map[string]Node) Directory {
+       ents := make([]DirEntry, 0, len(f))
+       for name, nd := range f {
+               ents = append(ents, FileEntry(name, nd))
+       }
+       sort.Slice(ents, func(i, j int) bool {
+               return ents[i].Name() < ents[j].Name()
+       })
+
+       return NewSliceDirectory(ents)
+}
+
+func NewSliceDirectory(files []DirEntry) Directory {
+       return &SliceFile{files}
+}
+
+func (f *SliceFile) Entries() DirIterator {
+       return &sliceIterator{files: f.files, n: -1}
+}
+
+func (f *SliceFile) Close() error {
+       return nil
+}
+
+func (f *SliceFile) Length() int {
+       return len(f.files)
+}
+
+func (f *SliceFile) Size() (int64, error) {
+       var size int64
+
+       for _, file := range f.files {
+               s, err := file.Node().Size()
+               if err != nil {
+                       return 0, err
+               }
+               size += s
+       }
+
+       return size, nil
+}
+
+var _ Directory = &SliceFile{}
+var _ DirEntry = fileEntry{}