package vfs import ( "fmt" "io/fs" "os" "sync" ) type directory struct { name string mode os.FileMode children map[string]interface{} mutex sync.Mutex } type directoryHandle struct { dir *directory idx int } func (d *directoryHandle) Stat() (fs.FileInfo, error) { sz, err := d.dir.Size() if err != nil { return nil, err } return &fileInfo{ name: d.dir.name, size: sz, mode: d.dir.mode | fs.ModeDir, }, nil } func (d *directoryHandle) Read(data []byte) (int, error) { return 0, fmt.Errorf("%s is a directory", d.dir.name) } func (d *directoryHandle) Close() error { return nil } func (d *directory) Size() (int64, error) { sum := int64(0) for _, e := range d.children { switch v := e.(type) { case *directory: dir := v sz, err := dir.Size() if err != nil { return 0, err } sum += sz case *MockFile: f := v f.open = true stat, err := f.Stat() if err != nil { return 0, err } sum += stat.Size() f.open = false case *File: f := v f.open = true stat, err := f.Stat() if err != nil { return 0, err } sum += stat.Size() f.open = false } } return sum, nil }