From 9b91a96dec8bbaa42ba84e3f916f3ba10a0cef9f Mon Sep 17 00:00:00 2001 From: "Gustavo L de Mello (Guz)" Date: Tue, 14 Jan 2025 18:00:41 -0300 Subject: [PATCH] feat(blog,fs): wrapppers for the std fs.FS and fs.File interfaces --- blogo/fs.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/blogo/fs.go b/blogo/fs.go index 739bcf4..0d78bd3 100644 --- a/blogo/fs.go +++ b/blogo/fs.go @@ -28,3 +28,62 @@ type File interface { fs.File Metadata() Metadata } + +type wrapperFS struct { + fs.FS + metadata Metadata + immutable bool +} + +func FsFS(f fs.FS, immutable ...bool) FS { + var m Metadata + var i bool + if len(immutable) > 0 && immutable[0] { + i = true + m = ImmutableMetadata(MetadataMap(map[string]any{})) + } else { + i = false + m = MetadataMap(map[string]any{}) + } + + return &wrapperFS{ + FS: f, + metadata: m, + immutable: i, + } +} + +func (f *wrapperFS) Metadata() Metadata { + return f.metadata +} + +func (f *wrapperFS) Open(name string) (File, error) { + file, err := f.FS.Open(name) + if err != nil { + return nil, err + } + return FsFile(file, f.immutable), nil +} + +type wrapperFile struct { + fs.File + metadata Metadata +} + +func FsFile(f fs.File, immutable ...bool) File { + var m Metadata + if len(immutable) > 0 && immutable[0] { + m = ImmutableMetadata(MetadataMap(map[string]any{})) + } else { + m = MetadataMap(map[string]any{}) + } + + return &wrapperFile{ + File: f, + metadata: m, + } +} + +func (f *wrapperFile) Metadata() Metadata { + return f.metadata +}