Skip to content

Commit fefc22c

Browse files
committed
relax types for Bind and Render funcs
This relaxes the Bind and Render to accept any type as a payload. If those types implement the Binder or Renderer interfaces, then the relevant method on the type is called. Sometimes the default Bind or Render behavior is sufficient, and I don't need any additional custom handling. Signed-off-by: Will Norris <will@tailscale.com>
1 parent 14f1cb3 commit fefc22c

1 file changed

Lines changed: 13 additions & 7 deletions

File tree

render.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,25 @@ type Binder interface {
1515
Bind(r *http.Request) error
1616
}
1717

18-
// Bind decodes a request body and executes the Binder method of the
19-
// payload structure.
20-
func Bind(r *http.Request, v Binder) error {
18+
// Bind decodes a request body into a payload structure.
19+
// If v implements the Binder interface, its Binder method is called.
20+
func Bind(r *http.Request, v interface{}) error {
2121
if err := Decode(r, v); err != nil {
2222
return err
2323
}
24-
return binder(r, v)
24+
if b, ok := v.(Binder); ok {
25+
return binder(r, b)
26+
}
27+
return nil
2528
}
2629

2730
// Render renders a single payload and respond to the client request.
28-
func Render(w http.ResponseWriter, r *http.Request, v Renderer) error {
29-
if err := renderer(w, r, v); err != nil {
30-
return err
31+
// If v implements the Renderer interface, its Render method is called.
32+
func Render(w http.ResponseWriter, r *http.Request, v interface{}) error {
33+
if rd, ok := v.(Renderer); ok {
34+
if err := renderer(w, r, rd); err != nil {
35+
return err
36+
}
3137
}
3238
Respond(w, r, v)
3339
return nil

0 commit comments

Comments
 (0)