-
-
Notifications
You must be signed in to change notification settings - Fork 182
/
json.go
54 lines (49 loc) · 926 Bytes
/
json.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
package virtual
import (
"encoding/json"
"io/fs"
"time"
)
func MarshalJSON(file fs.File) ([]byte, error) {
entry, err := From(file)
if err != nil {
return nil, err
}
return json.Marshal(entry)
}
type jsonEntry struct {
Path string
Data []byte
Mode fs.FileMode
ModTime time.Time
Sys interface{}
Entries []*DirEntry
}
func (f *jsonEntry) Open() fs.File {
if f.Mode.IsDir() {
entries := make([]fs.DirEntry, len(f.Entries))
for i, entry := range f.Entries {
entries[i] = entry
}
return &openDir{&File{
Path: f.Path,
Mode: f.Mode,
ModTime: f.ModTime,
Entries: entries,
}, 0}
}
return &openFile{&File{
Path: f.Path,
Data: f.Data,
Mode: f.Mode,
ModTime: f.ModTime,
}, 0}
}
func UnmarshalJSON(file []byte) (fs.File, error) {
var entry jsonEntry
err := json.Unmarshal(file, &entry)
if err != nil {
return nil, err
}
return entry.Open(), nil
}