fix: panic on invalid NodeRenderer in renderer

Uses the previously ignored type check ok value with a similar
structure to parse.go for the With* functional options.

Changes:
runtime error: invalid memory address or nil pointer dereference
to:
<TypeName> is not a NodeRenderer
This commit is contained in:
Brad Erickson 2020-12-27 11:10:50 -08:00
parent 6c741ae251
commit cbb021173c
2 changed files with 33 additions and 1 deletions

View file

@ -3,6 +3,7 @@ package renderer
import (
"bufio"
"fmt"
"io"
"sync"
@ -139,7 +140,10 @@ func (r *renderer) Render(w io.Writer, source []byte, n ast.Node) error {
l := len(r.config.NodeRenderers)
for i := l - 1; i >= 0; i-- {
v := r.config.NodeRenderers[i]
nr, _ := v.Value.(NodeRenderer)
nr, ok := v.Value.(NodeRenderer)
if !ok {
panic(fmt.Errorf("%T is not a NodeRenderer", v.Value))
}
if se, ok := v.Value.(SetOptioner); ok {
for oname, ovalue := range r.options {
se.SetOption(oname, ovalue)

28
renderer/renderer_test.go Normal file
View file

@ -0,0 +1,28 @@
package renderer_test
import (
"testing"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/util"
)
type invalid struct{}
func TestInvalidNodeRenderer(t *testing.T) {
defer func() {
r := recover()
if r == nil {
t.Errorf("did not panic")
return
}
rerr := r.(error)
if rerr.Error() != "*renderer_test.invalid is not a NodeRenderer" {
t.Errorf("unexpected panic caught: %v", rerr)
}
}()
r := renderer.NewRenderer(renderer.WithNodeRenderers(util.Prioritized(&invalid{}, 1000)))
r.Render(nil, nil, nil)
}