diff --git a/renderer/renderer.go b/renderer/renderer.go index 10f6d40..d3fdb34 100644 --- a/renderer/renderer.go +++ b/renderer/renderer.go @@ -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) diff --git a/renderer/renderer_test.go b/renderer/renderer_test.go new file mode 100644 index 0000000..303679c --- /dev/null +++ b/renderer/renderer_test.go @@ -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) +}