feat(blogo): render step and renderer plugins

This commit is contained in:
Guz
2025-01-09 10:22:00 -03:00
parent 647c9246b5
commit bba986e96a
2 changed files with 27 additions and 16 deletions

View File

@@ -32,6 +32,7 @@ type Blogo struct {
files fs.FS files fs.FS
sources []SourcerPlugin sources []SourcerPlugin
renderers []RendererPlugin
log *slog.Logger log *slog.Logger
panic bool panic bool
@@ -64,6 +65,10 @@ func (b *Blogo) Use(p Plugin) {
log.Debug("Added plugin", slog.String("type", "SourcerPlugin")) log.Debug("Added plugin", slog.String("type", "SourcerPlugin"))
b.sources = append(b.sources, p) 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) { 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") log.Debug("Writing response file")
buf := make([]byte, 1024) log.Debug("Rendering file")
for {
n, err := f.Read(buf)
if err != nil && err != io.EOF {
w.WriteHeader(http.StatusInternalServerError)
_, _ = w.Write([]byte(err.Error()))
}
if n == 0 { // TODO: Support for multiple renderers (conditional renderers)
break 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]) w.WriteHeader(http.StatusInternalServerError)
if err != nil { _, _ = w.Write([]byte(err.Error()))
w.WriteHeader(http.StatusInternalServerError) return
_, _ = w.Write([]byte(err.Error()))
}
} }
b.log.Debug("Finished responding file") log.Debug("Finished responding file")
} }
func (b *Blogo) Init() error { func (b *Blogo) Init() error {
@@ -138,6 +136,10 @@ func (b *Blogo) Init() error {
b.log.Debug("No SourcerPlugin found, using default one") b.log.Debug("No SourcerPlugin found, using default one")
b.Use(&defaultSourcer{}) 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) fs, err := b.sources[0].Source() // TOOD: Support for multiple sources (via another plugin or built-in, with prefixes or not)
if err != nil { if err != nil {

View File

@@ -21,3 +21,12 @@ func (f emptyFS) Open(name string) (fs.File, error) {
return nil, fs.ErrNotExist 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
}