From 6e631b4ccbe71299137469a69900b874d709fe35 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 25 May 2024 23:17:38 +0300 Subject: refactor vfs into its own package --- internal/server/repository/repository.go | 8 ++--- internal/types/entry.go | 10 +++--- internal/vfs.go | 58 -------------------------------- internal/vfs/memoryfs.go | 33 ++++++++++++++++++ internal/vfs/realfs.go | 44 ++++++++++++++++++++++++ internal/vfs/vfs.go | 8 +++++ 6 files changed, 94 insertions(+), 67 deletions(-) delete mode 100644 internal/vfs.go create mode 100644 internal/vfs/memoryfs.go create mode 100644 internal/vfs/realfs.go create mode 100644 internal/vfs/vfs.go diff --git a/internal/server/repository/repository.go b/internal/server/repository/repository.go index 029ca53..fa9a5f4 100644 --- a/internal/server/repository/repository.go +++ b/internal/server/repository/repository.go @@ -6,8 +6,8 @@ import ( "sync" "time" - "codeberg.org/snonux/gos/internal" "codeberg.org/snonux/gos/internal/types" + "codeberg.org/snonux/gos/internal/vfs" ) var ( @@ -24,7 +24,7 @@ type Repository struct { dataDir string entries map[string]types.Entry mu *sync.Mutex - vfs internal.VFS + vfs vfs.VFS } func Instance(dataDir string) *Repository { @@ -33,7 +33,7 @@ func Instance(dataDir string) *Repository { dataDir: dataDir, entries: make(map[string]types.Entry), mu: &sync.Mutex{}, - vfs: internal.RealFS{}, + vfs: vfs.RealFS{}, } }) return instance @@ -47,7 +47,7 @@ func (r Repository) add(entry types.Entry) { // Load repository into memory func (r Repository) load() error { - filePaths, err := r.vfs.FindFiles(r.dataDir) + filePaths, err := r.vfs.FindFiles(r.dataDir, ".json") if err != nil { return err } diff --git a/internal/types/entry.go b/internal/types/entry.go index 55391de..b4a05e4 100644 --- a/internal/types/entry.go +++ b/internal/types/entry.go @@ -7,7 +7,7 @@ import ( "strings" "sync" - "codeberg.org/snonux/gos/internal" + "codeberg.org/snonux/gos/internal/vfs" ) // Tells me whether the entry was shared to the sm platform named Name @@ -37,7 +37,7 @@ type Entry struct { Body string `json:"body"` Shared []Shared `json:"shared,omitempty"` Epoch int `json:"epoch,omitempty"` - vfs internal.VFS + vfs vfs.VFS // The checksum of the whole entry, can change depending on the state. checksum string @@ -57,11 +57,11 @@ func NewEntry(bytes []byte) (Entry, error) { return e, nil } -func NewEntryFromFile(filePath string, vfsToUse ...internal.VFS) (Entry, error) { +func NewEntryFromFile(filePath string, vfsToUse ...vfs.VFS) (Entry, error) { var ( bytes []byte err error - vfs internal.VFS = internal.RealFS{} + vfs vfs.VFS = vfs.RealFS{} ) if len(vfsToUse) > 0 { @@ -84,7 +84,7 @@ func NewEntryFromCopy(other Entry) (Entry, error) { func (e *Entry) initialize() { e.mu = &sync.Mutex{} e.checksumDirty = true - e.vfs = internal.RealFS{} + e.vfs = vfs.RealFS{} } func (e Entry) Equals(other Entry) bool { diff --git a/internal/vfs.go b/internal/vfs.go deleted file mode 100644 index 8b58a91..0000000 --- a/internal/vfs.go +++ /dev/null @@ -1,58 +0,0 @@ -package internal - -import ( - "log" - "os" - "path/filepath" - "strings" -) - -// virtual file system - useful for testing as well -type VFS interface { - ReadFile(name string) ([]byte, error) - SaveFile(filePath string, bytes []byte) error - FindFiles(dataPath string) ([]string, error) -} - -type RealFS struct{} - -func (RealFS) ReadFile(filePath string) ([]byte, error) { - return os.ReadFile(filePath) -} - -func (RealFS) SaveFile(filePath string, bytes []byte) error { - dir := filepath.Dir(filePath) - if _, err := os.Stat(dir); os.IsNotExist(err) { - if err := os.MkdirAll(dir, 0755); err != nil { - return err - } - } - return os.WriteFile(filePath, bytes, 0644) -} - -func (RealFS) FindFiles(dataDir string) ([]string, error) { - var filePaths []string - - visit := func() filepath.WalkFunc { - return func(path string, info os.FileInfo, err error) error { - if err != nil { - log.Println(err) - return nil - } - if info.IsDir() || !strings.HasSuffix(path, ".json") { - return nil - } - filePaths = append(filePaths, path) - /* - entry, err := types.NewEntryFromFile(path) - if err != err { - return err - } - r.add(entry) - */ - return nil - } - } - - return filePaths, filepath.Walk(dataDir, visit()) -} diff --git a/internal/vfs/memoryfs.go b/internal/vfs/memoryfs.go new file mode 100644 index 0000000..22b1611 --- /dev/null +++ b/internal/vfs/memoryfs.go @@ -0,0 +1,33 @@ +package vfs + +import ( + "fmt" + "strings" +) + +type MemoryFS map[string][]byte + +func (fs MemoryFS) ReadFile(filePath string) ([]byte, error) { + if bytes, ok := fs[filePath]; ok { + return bytes, nil + } + return []byte{}, fmt.Errorf("no such file path: %s", filePath) +} + +func (fs MemoryFS) SaveFile(filePath string, bytes []byte) error { + fs[filePath] = bytes + return nil +} + +func (fs MemoryFS) FindFiles(dataDir, suffix string) ([]string, error) { + var filePaths []string + + for filePath := range fs { + if !strings.HasSuffix(filePath, suffix) { + continue + } + filePaths = append(filePaths, filePath) + } + + return filePaths, nil +} diff --git a/internal/vfs/realfs.go b/internal/vfs/realfs.go new file mode 100644 index 0000000..8b9c9de --- /dev/null +++ b/internal/vfs/realfs.go @@ -0,0 +1,44 @@ +package vfs + +import ( + "log" + "os" + "path/filepath" + "strings" +) + +type RealFS struct{} + +func (RealFS) ReadFile(filePath string) ([]byte, error) { + return os.ReadFile(filePath) +} + +func (RealFS) SaveFile(filePath string, bytes []byte) error { + dir := filepath.Dir(filePath) + if _, err := os.Stat(dir); os.IsNotExist(err) { + if err := os.MkdirAll(dir, 0755); err != nil { + return err + } + } + return os.WriteFile(filePath, bytes, 0644) +} + +func (RealFS) FindFiles(dataDir, suffix string) ([]string, error) { + var filePaths []string + + visit := func() filepath.WalkFunc { + return func(path string, info os.FileInfo, err error) error { + if err != nil { + log.Println(err) + return nil + } + if info.IsDir() || !strings.HasSuffix(path, suffix) { + return nil + } + filePaths = append(filePaths, path) + return nil + } + } + + return filePaths, filepath.Walk(dataDir, visit()) +} diff --git a/internal/vfs/vfs.go b/internal/vfs/vfs.go new file mode 100644 index 0000000..0297ff9 --- /dev/null +++ b/internal/vfs/vfs.go @@ -0,0 +1,8 @@ +package vfs + +// virtual file system - useful for testing as well +type VFS interface { + ReadFile(name string) ([]byte, error) + SaveFile(filePath string, bytes []byte) error + FindFiles(dataPath, suffix string) ([]string, error) +} -- cgit v1.2.3