/
volume.go
56 lines (49 loc) 路 1.16 KB
/
volume.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
package goaff4
import (
"archive/zip"
"fmt"
"io/fs"
"net/url"
)
type volume struct {
urn string
objects map[string]parsedObject
zipfs *zip.Reader
}
func newVolume(zipfs *zip.Reader, objects map[string]parsedObject, volumeURI string) (*volume, error) {
_, err := url.Parse(volumeURI)
if err != nil {
return nil, err
}
return &volume{
zipfs: zipfs,
urn: volumeURI,
objects: objects,
}, nil
}
func (v *volume) Open(name string) (fs.File, error) {
if name == "." {
return &pseudoRoot{volume: v}, nil
}
name = "aff4://" + name
if o, ok := v.objects[name]; ok {
switch o.metadata["type"][0] {
case "Map":
return newMap(v.zipfs, v.objects, name)
case "imageStream":
return newImageStream(v.zipfs, v.objects, name)
}
return nil, fmt.Errorf("unknown type %s", o.metadata["type"])
}
return nil, fmt.Errorf("%w: %s", fs.ErrNotExist, name)
}
func (v *volume) Stat(name string) (fs.FileInfo, error) {
if name == "." {
return &pseudoRoot{volume: v}, nil
}
name = "aff4://" + name
if o, ok := v.objects[name]; ok {
return &dirEntry{uri: name, metadata: o.metadata}, nil
}
return nil, fmt.Errorf("%w: %s", fs.ErrNotExist, name)
}