98 lines · 2.6 KB · Go
RawDownload
package fs import (	"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))