From e1032f693f59b1ed9eae0969b4b3b5e64ac57590 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 23 Feb 2024 16:02:18 +0000 Subject: [PATCH] fs: add DirWrapper for wrapping Directory-s with optional methods --- fs/dir_wrapper.go | 79 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 fs/dir_wrapper.go diff --git a/fs/dir_wrapper.go b/fs/dir_wrapper.go new file mode 100644 index 000000000..9fe135703 --- /dev/null +++ b/fs/dir_wrapper.go @@ -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) +)