1 Commits

Author SHA1 Message Date
orangix
62c821eb9f fix double write errors 2026-03-12 04:22:08 +01:00
2 changed files with 40 additions and 4 deletions

View File

@@ -28,6 +28,9 @@ func wrapHandler(h handler) http.Handler {
}() }()
err := h(w, r) err := h(w, r)
if err != nil { if err != nil {
if render.IsRendererError(err) {
return
}
fmt.Println(err) fmt.Println(err)
utils.RenderError(w, r, 500, err.Error()) utils.RenderError(w, r, 500, err.Error())
} }

View File

@@ -2,6 +2,7 @@
package render package render
import ( import (
"errors"
"fmt" "fmt"
"io" "io"
"io/fs" "io/fs"
@@ -63,14 +64,46 @@ func Initialize(views fs.FS) {
func (r *renderer) Render(out io.Writer, name string, bind map[string]any) error { func (r *renderer) Render(out io.Writer, name string, bind map[string]any) error {
tmpl := r.templates[name] tmpl := r.templates[name]
if tmpl == nil { if tmpl == nil {
return fmt.Errorf("render: template %s does not exist", name) return re(fmt.Errorf("render: template %s does not exist", name))
} }
parsed, err := tmpl.Exec(bind) parsed, err := tmpl.Exec(bind)
if err != nil { if err != nil {
return fmt.Errorf("render: %w", err) return re(fmt.Errorf("render: %w", err))
} }
if _, err = out.Write([]byte(parsed)); err != nil { if _, err = out.Write([]byte(parsed)); err != nil {
return fmt.Errorf("render: %w", err) return re(fmt.Errorf("render: %w", err))
} }
return err return re(err)
}
var reSentinel = &struct{}{}
type RendererError struct {
u *struct{}
err error
}
func re(err error) error {
if err == nil {
return nil
}
return RendererError{reSentinel, err}
}
func (re RendererError) Error() string {
return re.Error()
}
func (re RendererError) Unwrap() error {
e1, ok := re.err.(interface{ Unwrap() error })
if ok {
return e1.Unwrap()
}
e2, ok := re.err.(interface{ Unwrap() []error })
if ok {
return errors.Join(e2.Unwrap()...)
}
return nil
}
func IsRendererError(err error) bool {
re, ok := err.(RendererError)
return ok && re.u == reSentinel
} }