From 662f559286aa78f444c9ed08f3cf96ee543a548e Mon Sep 17 00:00:00 2001 From: Clayton Craft Date: Fri, 17 Feb 2023 23:31:21 -0800 Subject: [PATCH] filelist: Add FileList type This adds a new type, FileList, to manage another new type (File). File contains the mapping of source --> dest for a file or directory. --- internal/filelist/filelist.go | 54 ++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/internal/filelist/filelist.go b/internal/filelist/filelist.go index 3733d6e..997181a 100644 --- a/internal/filelist/filelist.go +++ b/internal/filelist/filelist.go @@ -1,5 +1,57 @@ package filelist +import "sync" + type FileLister interface { - List() ([]string, error) + List() (*FileList, error) +} + +type File struct { + Source string + Dest string +} + +type FileList struct { + m map[string]string + sync.RWMutex +} + +func NewFileList() *FileList { + return &FileList{ + m: make(map[string]string), + } +} + +func (f *FileList) Add(src string, dest string) { + f.Lock() + defer f.Unlock() + + f.m[src] = dest +} + +func (f *FileList) Get(src string) (string, bool) { + f.RLock() + defer f.RUnlock() + + dest, found := f.m[src] + return dest, found +} + +// iterate through the list and and send each one as a new File over the +// returned channel +func (f *FileList) IterItems() <-chan File { + ch := make(chan File) + go func() { + f.RLock() + defer f.RUnlock() + + for src, dest := range f.m { + ch <- File{ + Source: src, + Dest: dest, + } + } + close(ch) + }() + return ch }