feat(blogo): render step and renderer plugins
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user