From bba986e96a1a8b8856a2b7989841f4383a406ec9 Mon Sep 17 00:00:00 2001 From: "Gustavo L de Mello (Guz)" Date: Thu, 9 Jan 2025 10:22:00 -0300 Subject: [PATCH] feat(blogo): render step and renderer plugins --- blogo/blogo.go | 34 ++++++++++++++++++---------------- blogo/defaults.go | 9 +++++++++ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/blogo/blogo.go b/blogo/blogo.go index 49829ce..12d8c55 100644 --- a/blogo/blogo.go +++ b/blogo/blogo.go @@ -32,6 +32,7 @@ type Blogo struct { files fs.FS sources []SourcerPlugin + renderers []RendererPlugin log *slog.Logger panic bool @@ -64,6 +65,10 @@ func (b *Blogo) Use(p Plugin) { log.Debug("Added plugin", slog.String("type", "SourcerPlugin")) b.sources = append(b.sources, p) } + if p, ok := p.(RendererPlugin); ok { + log.Debug("Added plugin", slog.String("type", "RenderPlugin")) + b.renderers = append(b.renderers, p) + } } func (b *Blogo) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -109,26 +114,19 @@ func (b *Blogo) ServeHTTP(w http.ResponseWriter, r *http.Request) { log.Debug("Writing response file") - buf := make([]byte, 1024) - for { - n, err := f.Read(buf) - if err != nil && err != io.EOF { - w.WriteHeader(http.StatusInternalServerError) - _, _ = w.Write([]byte(err.Error())) - } + log.Debug("Rendering file") - if n == 0 { - break - } + // TODO: Support for multiple renderers (conditional renderers) + err = b.renderers[0].Render(f, w) + if err != nil { + log.Error("Failed to render file", slog.String("error", err.Error())) - _, err = w.Write(buf[:n]) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - _, _ = w.Write([]byte(err.Error())) - } + w.WriteHeader(http.StatusInternalServerError) + _, _ = w.Write([]byte(err.Error())) + return } - b.log.Debug("Finished responding file") + log.Debug("Finished responding file") } func (b *Blogo) Init() error { @@ -138,6 +136,10 @@ func (b *Blogo) Init() error { b.log.Debug("No SourcerPlugin found, using default one") b.Use(&defaultSourcer{}) } + if len(b.renderers) == 0 { + b.log.Debug("No RendererPlugin found, using default one") + b.Use(&defaultRenderer{}) + } fs, err := b.sources[0].Source() // TOOD: Support for multiple sources (via another plugin or built-in, with prefixes or not) if err != nil { diff --git a/blogo/defaults.go b/blogo/defaults.go index 8939f32..f626c83 100644 --- a/blogo/defaults.go +++ b/blogo/defaults.go @@ -21,3 +21,12 @@ func (f emptyFS) Open(name string) (fs.File, error) { return nil, fs.ErrNotExist } +type defaultRenderer struct{} + +func (p *defaultRenderer) Name() string { + return "blogo-default-renderer" +} + +func (p *defaultRenderer) Render(f fs.File, w io.Writer) error { + return nil +}