/
generic.go
147 lines (126 loc) · 3.54 KB
/
generic.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package fs_ns
import (
"os"
"path/filepath"
"github.com/go-git/go-billy/v5"
"github.com/inoxlang/inox/internal/afs"
)
var _ billy.Basic = (*GenericBasic)(nil)
var _ billy.File = (*GenericFile)(nil)
// GenericBasic is an implementation of billy.Basic. All the fields are optional:
// for example if .CreateFn is not provided the Create method will always return billy.ErrNotSupported.
type GenericBasic struct {
CreateFn func(filename string) (afs.File, error)
OpenFn func(filename string) (afs.File, error)
OpenFileFn func(filename string, flag int, perm os.FileMode) (afs.File, error)
StatFn func(filename string) (os.FileInfo, error)
RenameFn func(oldpath, newpath string) error
RemoveFn func(filename string) error
JoinFn func(elem ...string) string
}
func (i GenericBasic) Create(filename string) (afs.File, error) {
if i.CreateFn == nil {
return nil, billy.ErrNotSupported
}
return i.CreateFn(filename)
}
func (i GenericBasic) Open(filename string) (afs.File, error) {
if i.OpenFn == nil {
return nil, billy.ErrNotSupported
}
return i.OpenFn(filename)
}
func (i GenericBasic) OpenFile(filename string, flag int, perm os.FileMode) (afs.File, error) {
if i.OpenFileFn == nil {
return nil, billy.ErrNotSupported
}
return i.OpenFileFn(filename, flag, perm)
}
func (i GenericBasic) Stat(filename string) (os.FileInfo, error) {
if i.StatFn == nil {
return nil, billy.ErrNotSupported
}
return i.StatFn(filename)
}
func (i GenericBasic) Rename(oldpath, newpath string) error {
if i.RenameFn == nil {
return billy.ErrNotSupported
}
return i.RenameFn(oldpath, newpath)
}
func (i GenericBasic) Remove(filename string) error {
if i.RemoveFn == nil {
return billy.ErrNotSupported
}
return i.RemoveFn(filename)
}
func (i GenericBasic) Join(elem ...string) string {
if i.JoinFn == nil {
return filepath.Join(elem...)
}
return i.JoinFn(elem...)
}
// GenericFile is an implementation of billy.File. All the fields are optional:
// for example if .WriteFn is not provided the Write method will always return billy.ErrNotSupported.
type GenericFile struct {
Filename string
WriteFn func(p []byte) (n int, err error)
ReadFn func(p []byte) (n int, err error)
ReadAtFn func(p []byte, off int64) (n int, err error)
SeekFn func(offset int64, whence int) (int64, error)
CloseFn func() error
LockFn func() error
UnlockFn func() error
TruncateFn func(size int64) error
}
func (f *GenericFile) Name() string {
return f.Filename
}
func (f *GenericFile) Write(p []byte) (n int, err error) {
if f.WriteFn == nil {
return 0, billy.ErrNotSupported
}
return f.WriteFn(p)
}
func (f *GenericFile) Read(p []byte) (n int, err error) {
if f.ReadFn == nil {
return 0, billy.ErrNotSupported
}
return f.ReadFn(p)
}
func (f *GenericFile) ReadAt(p []byte, off int64) (n int, err error) {
if f.ReadAtFn == nil {
return 0, billy.ErrNotSupported
}
return f.ReadAtFn(p, off)
}
func (f *GenericFile) Seek(offset int64, whence int) (int64, error) {
if f.SeekFn == nil {
return 0, billy.ErrNotSupported
}
return f.SeekFn(offset, whence)
}
func (f *GenericFile) Close() error {
if f.CloseFn == nil {
return billy.ErrNotSupported
}
return f.CloseFn()
}
func (f *GenericFile) Lock() error {
if f.LockFn == nil {
return billy.ErrNotSupported
}
return f.LockFn()
}
func (f *GenericFile) Unlock() error {
if f.UnlockFn == nil {
return billy.ErrNotSupported
}
return f.UnlockFn()
}
func (f *GenericFile) Truncate(size int64) error {
if f.UnlockFn == nil {
return billy.ErrNotSupported
}
return f.TruncateFn(size)
}