package fsimport ( "context" "time")// DirWrapper wraps a Directory object so the Remote can be overriddentype DirWrapper struct { 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}// 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, }}// 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}// String returns the namefunc (d *DirWrapper) String() string { return d.remote}// Remote returns the remote pathfunc (d *DirWrapper) Remote() string { return d.remote}// SetRemote sets the remotefunc (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 Metadatafunc (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 metadatafunc (d *DirWrapper) SetMetadata(ctx context.Context, metadata Metadata) error { do, ok := d.Directory.(SetMetadataer) if !ok { if d.failSilently { Debugf(d, "Can't SetMetadata for this directory (%T from %v) -- skipping", d.Directory, d.Fs()) return nil } 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 { if d.failSilently { Debugf(d, "Can't SetModTime for this directory (%T from %v) -- skipping", d.Directory, d.Fs()) return nil } return ErrorNotImplemented } return do.SetModTime(ctx, t)}// Check interfacesvar ( _ DirEntry = (*DirWrapper)(nil) _ Directory = (*DirWrapper)(nil) _ FullDirectory = (*DirWrapper)(nil))
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
failSilently bool // if set, ErrorNotImplemented should not be considered an error for this 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,
}
}
// 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
}
// 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 {
if d.failSilently {
Debugf(d, "Can't SetMetadata for this directory (%T from %v) -- skipping", d.Directory, d.Fs())
return nil
}
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 {
if d.failSilently {
Debugf(d, "Can't SetModTime for this directory (%T from %v) -- skipping", d.Directory, d.Fs())
return nil
}
return ErrorNotImplemented
}
return do.SetModTime(ctx, t)
}
// Check interfaces
var (
_ DirEntry = (*DirWrapper)(nil)
_ Directory = (*DirWrapper)(nil)
_ FullDirectory = (*DirWrapper)(nil)
)