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