mirror of
https://github.com/rclone/rclone.git
synced 2024-11-07 17:14:44 +01:00
fs: add DirWrapper for wrapping Directory-s with optional methods
This commit is contained in:
parent
a4cadd1128
commit
e1032f693f
79
fs/dir_wrapper.go
Normal file
79
fs/dir_wrapper.go
Normal file
@ -0,0 +1,79 @@
|
||||
package fs
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
)
|
||||
|
||||
// DirWrapper wraps a Directory object so the Remote can be overridden
|
||||
type DirWrapper struct {
|
||||
Directory // Directory we are wrapping
|
||||
remote string // name of the directory
|
||||
}
|
||||
|
||||
// NewDirWrapper creates a wrapper for a directory object
|
||||
//
|
||||
// This passes through optional methods and should be used for
|
||||
// wrapping backends to wrap native directories.
|
||||
func NewDirWrapper(remote string, d Directory) *DirWrapper {
|
||||
return &DirWrapper{
|
||||
Directory: d,
|
||||
remote: remote,
|
||||
}
|
||||
}
|
||||
|
||||
// String returns the name
|
||||
func (d *DirWrapper) String() string {
|
||||
return d.remote
|
||||
}
|
||||
|
||||
// Remote returns the remote path
|
||||
func (d *DirWrapper) Remote() string {
|
||||
return d.remote
|
||||
}
|
||||
|
||||
// SetRemote sets the remote
|
||||
func (d *DirWrapper) SetRemote(remote string) *DirWrapper {
|
||||
d.remote = remote
|
||||
return d
|
||||
}
|
||||
|
||||
// Metadata returns metadata for an DirEntry
|
||||
//
|
||||
// It should return nil if there is no Metadata
|
||||
func (d *DirWrapper) Metadata(ctx context.Context) (Metadata, error) {
|
||||
do, ok := d.Directory.(Metadataer)
|
||||
if !ok {
|
||||
return nil, nil
|
||||
}
|
||||
return do.Metadata(ctx)
|
||||
}
|
||||
|
||||
// SetMetadata sets metadata for an DirEntry
|
||||
//
|
||||
// It should return fs.ErrorNotImplemented if it can't set metadata
|
||||
func (d *DirWrapper) SetMetadata(ctx context.Context, metadata Metadata) error {
|
||||
do, ok := d.Directory.(SetMetadataer)
|
||||
if !ok {
|
||||
return ErrorNotImplemented
|
||||
}
|
||||
return do.SetMetadata(ctx, metadata)
|
||||
}
|
||||
|
||||
// SetModTime sets the metadata on the DirEntry to set the modification date
|
||||
//
|
||||
// If there is any other metadata it does not overwrite it.
|
||||
func (d *DirWrapper) SetModTime(ctx context.Context, t time.Time) error {
|
||||
do, ok := d.Directory.(SetModTimer)
|
||||
if !ok {
|
||||
return ErrorNotImplemented
|
||||
}
|
||||
return do.SetModTime(ctx, t)
|
||||
}
|
||||
|
||||
// Check interfaces
|
||||
var (
|
||||
_ DirEntry = (*DirWrapper)(nil)
|
||||
_ Directory = (*DirWrapper)(nil)
|
||||
_ FullDirectory = (*DirWrapper)(nil)
|
||||
)
|
Loading…
Reference in New Issue
Block a user