46 lines
912 B
Go
46 lines
912 B
Go
package mux
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"log/slog"
|
|
"net/http"
|
|
)
|
|
|
|
type Renderer interface {
|
|
Render(context.Context, http.ResponseWriter) error
|
|
}
|
|
|
|
func Render(w http.ResponseWriter, r *http.Request, renderable Renderer) {
|
|
if err := renderable.Render(r.Context(), w); err != nil {
|
|
slog.ErrorContext(r.Context(), "failed render template", slog.Any("err", err))
|
|
}
|
|
}
|
|
|
|
type RendererFunc func(context.Context, http.ResponseWriter) error
|
|
|
|
func (r RendererFunc) Render(ctx context.Context, w http.ResponseWriter) error {
|
|
return r(ctx, w)
|
|
}
|
|
|
|
type IoRenderer interface {
|
|
Render(context.Context, io.Writer) error
|
|
}
|
|
|
|
func Http(code int, inner IoRenderer) Renderer {
|
|
return httpWrapper{
|
|
code: code,
|
|
inner: inner,
|
|
}
|
|
}
|
|
|
|
type httpWrapper struct {
|
|
code int
|
|
inner IoRenderer
|
|
}
|
|
|
|
func (r httpWrapper) Render(ctx context.Context, w http.ResponseWriter) error {
|
|
w.WriteHeader(r.code)
|
|
return r.inner.Render(ctx, w)
|
|
}
|