124 lines
2.7 KiB
Go
124 lines
2.7 KiB
Go
|
package rclone
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"io/fs"
|
||
|
|
||
|
"git.kmsign.ru/royalcat/tstor/src/vfs"
|
||
|
rclonefs "github.com/rclone/rclone/fs"
|
||
|
)
|
||
|
|
||
|
type fsWrapper struct {
|
||
|
vfs.DefaultFS
|
||
|
fs rclonefs.Fs
|
||
|
}
|
||
|
|
||
|
// Open implements vfs.Filesystem.
|
||
|
func (w *fsWrapper) Open(ctx context.Context, filename string) (vfs.File, error) {
|
||
|
obj, err := w.fs.NewObject(ctx, filename)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &fileWrapper{name: filename, obj: obj}, nil
|
||
|
}
|
||
|
|
||
|
// ReadDir implements vfs.Filesystem.
|
||
|
func (w *fsWrapper) ReadDir(ctx context.Context, path string) ([]fs.DirEntry, error) {
|
||
|
panic("unimplemented")
|
||
|
|
||
|
// path = vfs.RemoveTrailingSlash(path)
|
||
|
|
||
|
// entries, err := w.fs.List(ctx, path)
|
||
|
// if err != nil {
|
||
|
// return nil, err
|
||
|
// }
|
||
|
|
||
|
// out := make([]fs.DirEntry, 0, len(entries))
|
||
|
// for _, e := range entries {
|
||
|
|
||
|
// }
|
||
|
|
||
|
}
|
||
|
|
||
|
// Rename implements vfs.Filesystem.
|
||
|
func (f *fsWrapper) Rename(ctx context.Context, oldpath string, newpath string) error {
|
||
|
panic("unimplemented")
|
||
|
}
|
||
|
|
||
|
// Stat implements vfs.Filesystem.
|
||
|
func (f *fsWrapper) Stat(ctx context.Context, filename string) (fs.FileInfo, error) {
|
||
|
panic("unimplemented")
|
||
|
}
|
||
|
|
||
|
// Type implements vfs.Filesystem.
|
||
|
// Subtle: this method shadows the method (DefaultFS).Type of fsWrapper.DefaultFS.
|
||
|
func (f *fsWrapper) Type() fs.FileMode {
|
||
|
panic("unimplemented")
|
||
|
}
|
||
|
|
||
|
// Unlink implements vfs.Filesystem.
|
||
|
func (f *fsWrapper) Unlink(ctx context.Context, filename string) error {
|
||
|
panic("unimplemented")
|
||
|
}
|
||
|
|
||
|
var _ vfs.Filesystem = (*fsWrapper)(nil)
|
||
|
|
||
|
type fileWrapper struct {
|
||
|
name string
|
||
|
obj rclonefs.Object
|
||
|
}
|
||
|
|
||
|
var _ vfs.File = (*fileWrapper)(nil)
|
||
|
|
||
|
// Close implements vfs.File.
|
||
|
func (f *fileWrapper) Close(ctx context.Context) error {
|
||
|
return f.Close(ctx)
|
||
|
}
|
||
|
|
||
|
// Info implements vfs.File.
|
||
|
func (f *fileWrapper) Info() (fs.FileInfo, error) {
|
||
|
return vfs.NewFileInfo(f.name, f.Size()), nil
|
||
|
}
|
||
|
|
||
|
// IsDir implements vfs.File.
|
||
|
func (f *fileWrapper) IsDir() bool {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// Name implements vfs.File.
|
||
|
func (f *fileWrapper) Name() string {
|
||
|
return f.name
|
||
|
}
|
||
|
|
||
|
// Read implements vfs.File.
|
||
|
func (f *fileWrapper) Read(ctx context.Context, p []byte) (n int, err error) {
|
||
|
panic("unimplemented")
|
||
|
}
|
||
|
|
||
|
// Seek implements vfs.File.
|
||
|
func (f *fileWrapper) Seek(offset int64, whence int) (int64, error) {
|
||
|
panic("unimplemented")
|
||
|
}
|
||
|
|
||
|
// ReadAt implements vfs.File.
|
||
|
func (f *fileWrapper) ReadAt(ctx context.Context, p []byte, off int64) (n int, err error) {
|
||
|
rc, err := f.obj.Open(ctx, &rclonefs.RangeOption{Start: off, End: off + int64(len(p))})
|
||
|
if err != nil {
|
||
|
return 0, err
|
||
|
}
|
||
|
defer rc.Close()
|
||
|
|
||
|
return rc.Read(p)
|
||
|
}
|
||
|
|
||
|
// Size implements vfs.File.
|
||
|
func (f *fileWrapper) Size() int64 {
|
||
|
return f.Size()
|
||
|
}
|
||
|
|
||
|
// Type implements vfs.File.
|
||
|
func (f *fileWrapper) Type() fs.FileMode {
|
||
|
return vfs.ModeFileRO
|
||
|
}
|