ipld-eth-server/vendor/github.com/ipfs/go-ipfs-files/slicedirectory.go
Elizabeth Engelman 36533f7c3f Update vendor directory and make necessary code changes
Fixes for new geth version
2019-09-25 16:32:27 -05:00

98 lines
1.7 KiB
Go

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{}