-
Notifications
You must be signed in to change notification settings - Fork 0
/
memfile.go
120 lines (99 loc) · 2.6 KB
/
memfile.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
package kvfs
import (
"bytes"
"fmt"
"io"
"io/fs"
"time"
ki "github.com/takanoriyanagitani/go-kvif"
)
var TimeEpoch time.Time = time.Unix(0, 0)
// MemFile implements fs.File.
// Close method is no-op.
type MemFile struct {
data *bytes.Reader
fileinfo fs.FileInfo
}
func memFileNew(data *bytes.Reader, fileinfo fs.FileInfo) MemFile {
return MemFile{
data,
fileinfo,
}
}
func (m MemFile) Stat() (fs.FileInfo, error) { return m.fileinfo, nil }
func (m MemFile) Read(b []byte) (int, error) { return m.data.Read(b) }
func (m MemFile) Close() error { return nil }
func (m MemFile) Size() int64 { return m.data.Size() }
func (m MemFile) ReadAt(p []byte, off int64) (int, error) { return m.data.ReadAt(p, off) }
func (m MemFile) ToSized() ReaderAtSized {
return ReaderAtSized{
ra: m,
sz: m.Size(),
}
}
type TimeProvider func() time.Time
func TimeProviderConstNew(ct time.Time) TimeProvider { return func() time.Time { return ct } }
var TimeProviderEpoch TimeProvider = TimeProviderConstNew(TimeEpoch)
type MemFileBuilder struct {
Name string
Reader io.Reader
Modified time.Time
ToBytes ki.Reader2Bytes
Mib MemInfoBuilder
}
func (m MemFileBuilder) build(b []byte) MemFile {
var sz int64 = int64(len(b))
var mi MemInfo = m.Mib(m.Modified)(m.Name)(sz)
return MemFile{
data: bytes.NewReader(b),
fileinfo: mi,
}
}
var MemFileBuilderDefault = MemFileBuilder{}.Default()
// Default creates MemFileBuilder with default settings.
//
// - ToBytes: UnlimitedRead2Bytes
// - Mib: MemInfoBuilderDefault
func (m MemFileBuilder) Default() MemFileBuilder {
m.ToBytes = ki.UnlimitedRead2Bytes
m.Mib = MemInfoBuilderDefault
return m
}
func (m MemFileBuilder) WithRead2Bytes(r2b ki.Reader2Bytes) MemFileBuilder {
m.ToBytes = r2b
return m
}
func (m MemFileBuilder) WithInfoBuilder(ib MemInfoBuilder) MemFileBuilder {
m.Mib = ib
return m
}
func (m MemFileBuilder) WithModified(t time.Time) MemFileBuilder {
m.Modified = t
return m
}
func (m MemFileBuilder) WithName(name string) MemFileBuilder {
m.Name = name
return m
}
func (m MemFileBuilder) WithReader(r io.Reader) MemFileBuilder {
m.Reader = r
return m
}
func (m MemFileBuilder) Build() (MemFile, error) {
var valid bool = ki.IterFromArr([]bool{
0 < len(m.Name),
nil != m.Reader,
nil != m.ToBytes,
nil != m.Mib,
}).All(ki.Identity[bool])
return ki.ErrorFromBool(
valid,
func() (MemFile, error) {
return ki.ComposeErr(
m.ToBytes,
ki.ErrorFuncCreate(m.build),
)(m.Reader)
},
func() error { return fmt.Errorf("Invalid builder") },
)
}