2024-02-23 16:02:18 +00:00
|
|
|
package fs
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
// DirWrapper wraps a Directory object so the Remote can be overridden
|
|
|
|
type DirWrapper struct {
|
2024-03-04 07:48:34 +00:00
|
|
|
Directory // Directory we are wrapping
|
|
|
|
remote string // name of the directory
|
|
|
|
failSilently bool // if set, ErrorNotImplemented should not be considered an error for this directory
|
2024-02-23 16:02:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-04 07:48:34 +00:00
|
|
|
// NewLimitedDirWrapper creates a DirWrapper that should fail silently instead of erroring for ErrorNotImplemented.
|
|
|
|
//
|
|
|
|
// Intended for exceptional dirs lacking abilities that the Fs otherwise usually supports
|
|
|
|
// (ex. a Combine root which can't set metadata/modtime, regardless of support by wrapped backend)
|
|
|
|
func NewLimitedDirWrapper(remote string, d Directory) *DirWrapper {
|
|
|
|
dw := NewDirWrapper(remote, d)
|
|
|
|
dw.failSilently = true
|
|
|
|
return dw
|
|
|
|
}
|
|
|
|
|
2024-02-23 16:02:18 +00:00
|
|
|
// 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 {
|
2024-03-04 07:48:34 +00:00
|
|
|
if d.failSilently {
|
|
|
|
Debugf(d, "Can't SetMetadata for this directory (%T from %v) -- skipping", d.Directory, d.Fs())
|
|
|
|
return nil
|
|
|
|
}
|
2024-02-23 16:02:18 +00:00
|
|
|
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 {
|
2024-03-04 07:48:34 +00:00
|
|
|
if d.failSilently {
|
|
|
|
Debugf(d, "Can't SetModTime for this directory (%T from %v) -- skipping", d.Directory, d.Fs())
|
|
|
|
return nil
|
|
|
|
}
|
2024-02-23 16:02:18 +00:00
|
|
|
return ErrorNotImplemented
|
|
|
|
}
|
|
|
|
return do.SetModTime(ctx, t)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check interfaces
|
|
|
|
var (
|
|
|
|
_ DirEntry = (*DirWrapper)(nil)
|
|
|
|
_ Directory = (*DirWrapper)(nil)
|
|
|
|
_ FullDirectory = (*DirWrapper)(nil)
|
|
|
|
)
|