From 7cdcab633f1ef321a4b23ddb4c5de2a6890c9cd4 Mon Sep 17 00:00:00 2001 From: "Gustavo L de Mello (Guz)" Date: Tue, 14 Jan 2025 17:35:11 -0300 Subject: [PATCH] feat(blogo,plugins,metadata): implement new metadata api in multisourcer --- blogo/metadata.go | 26 ++++++++++++++++++++++++++ blogo/plugin_multisourcer.go | 22 +++++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/blogo/metadata.go b/blogo/metadata.go index 24a3dfa..2f86d31 100644 --- a/blogo/metadata.go +++ b/blogo/metadata.go @@ -56,3 +56,29 @@ func (m MetadataMap) Delete(key string, strict ...bool) error { return nil } +type multiFSMetadata struct { + MetadataMap + fileSystems []FS +} + +func NewMultiFSMetadata(fileSytems []FS) Metadata { + return &multiFSMetadata{ + MetadataMap: MetadataMap(map[string]any{}), + fileSystems: fileSytems, + } +} + +func (m *multiFSMetadata) Get(key string) (any, error) { + if v, err := m.MetadataMap.Get(key); err == nil { + return v, nil + } + + for _, m := range m.fileSystems { + v, err := m.Metadata().Get(key) + if err == nil { + return v, nil + } + } + return nil, ErrMetadataNotFound +} + diff --git a/blogo/plugin_multisourcer.go b/blogo/plugin_multisourcer.go index 7388437..20a528d 100644 --- a/blogo/plugin_multisourcer.go +++ b/blogo/plugin_multisourcer.go @@ -89,10 +89,10 @@ func (p *multiSourcer) Use(plugin Plugin) { } } -func (p *multiSourcer) Source() (fs.FS, error) { +func (p *multiSourcer) Source() (FS, error) { log := p.log - fileSystems := []fs.FS{} + fileSystems := []FS{} for _, s := range p.sources { log = log.With(slog.String("plugin", p.Name())) @@ -115,7 +115,7 @@ func (p *multiSourcer) Source() (fs.FS, error) { fileSystems = append(fileSystems, f) } - f := make([]fs.FS, len(fileSystems), len(fileSystems)) + f := make([]FS, len(fileSystems), len(fileSystems)) for i := range f { f[i] = fileSystems[i] } @@ -127,11 +127,23 @@ func (p *multiSourcer) Source() (fs.FS, error) { } type multiSourcerFS struct { - fileSystems []fs.FS + fileSystems []FS skipOnError bool } -func (mf *multiSourcerFS) Open(name string) (fs.File, error) { +func (pf *multiSourcerFS) Metadata() Metadata { + fs := make([]FS, len(pf.fileSystems), len(pf.fileSystems)) + + i := 0 + for _, v := range pf.fileSystems { + fs[i] = v + i++ + } + + return NewMultiFSMetadata(fs) +} + +func (mf *multiSourcerFS) Open(name string) (File, error) { for _, f := range mf.fileSystems { file, err := f.Open(name)