Skip to content
This repository was archived by the owner on Apr 18, 2024. It is now read-only.

Commit 384200f

Browse files
author
Alan Shaw
committed
feat: wip files.Node to fs.File adapter
1 parent d96d731 commit 384200f

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed

fs/adapter/unixfs.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package adapter
2+
3+
import (
4+
"errors"
5+
"io/fs"
6+
"time"
7+
8+
files "github.com/ipfs/go-ipfs-files"
9+
)
10+
11+
type unixFsFile struct {
12+
path string
13+
info fs.FileInfo
14+
node files.Node
15+
}
16+
17+
// NewFile creates an fs.File that is backed by an IPFS files.Node.
18+
func NewFile(name string, node files.Node) (fs.File, error) {
19+
size, err := node.Size()
20+
if err != nil {
21+
return nil, err
22+
}
23+
_, isDir := node.(files.Directory)
24+
return &unixFsFile{
25+
info: &unixFsFileInfo{
26+
name: name,
27+
size: size,
28+
modTime: time.Now(),
29+
isDir: isDir,
30+
},
31+
node: node,
32+
}, nil
33+
}
34+
35+
func (f *unixFsFile) Stat() (fs.FileInfo, error) {
36+
return f.info, nil
37+
}
38+
39+
func (f *unixFsFile) Read(p []byte) (int, error) {
40+
if ff, ok := f.node.(files.File); ok {
41+
return ff.Read(p)
42+
}
43+
return 0, errors.New("file not readable")
44+
}
45+
46+
func (f *unixFsFile) Close() error {
47+
return f.node.Close()
48+
}
49+
50+
func (f *unixFsFile) ReadDir(n int) ([]fs.DirEntry, error) {
51+
fd, isDir := f.node.(files.Directory)
52+
if !isDir {
53+
return nil, errors.New("not a directory")
54+
}
55+
56+
var ents []fs.DirEntry
57+
it := fd.Entries()
58+
for it.Next() {
59+
node := it.Node()
60+
NewFile(it.Name(), node)
61+
}
62+
if it.Err() != nil {
63+
return nil, it.Err()
64+
}
65+
66+
fl := len(d.files)
67+
if n <= 0 || n > fl {
68+
n = fl
69+
}
70+
var ents []fs.DirEntry
71+
for i := 0; i < n; i++ {
72+
inf, err := d.files[i].Stat()
73+
if err != nil {
74+
return nil, err
75+
}
76+
ents = append(ents, &DirEntry{file: d.files[i], info: inf})
77+
}
78+
return ents, nil
79+
}
80+
81+
type unixFsFileInfo struct {
82+
name string
83+
size int64
84+
modTime time.Time
85+
isDir bool
86+
}
87+
88+
func (i *unixFsFileInfo) Name() string {
89+
return i.name
90+
}
91+
92+
func (i *unixFsFileInfo) Size() int64 {
93+
return i.size
94+
}
95+
96+
func (i *unixFsFileInfo) Mode() fs.FileMode {
97+
if i.isDir {
98+
return fs.ModeDir | 0555
99+
}
100+
return fs.ModePerm
101+
}
102+
103+
func (i *unixFsFileInfo) ModTime() time.Time {
104+
return i.modTime
105+
}
106+
107+
func (i *unixFsFileInfo) IsDir() bool {
108+
return i.Mode().IsDir()
109+
}
110+
111+
func (i *unixFsFileInfo) Sys() interface{} {
112+
return nil
113+
}

0 commit comments

Comments
 (0)