diff --git a/renderer/renderer.go b/renderer/renderer.go index 10f6d40..fd510d9 100644 --- a/renderer/renderer.go +++ b/renderer/renderer.go @@ -3,6 +3,7 @@ package renderer import ( "bufio" + "fmt" "io" "sync" @@ -161,7 +162,14 @@ func (r *renderer) Render(w io.Writer, source []byte, n ast.Node) error { err := ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) { s := ast.WalkStatus(ast.WalkContinue) var err error - f := r.nodeRendererFuncs[n.Kind()] + + k := n.Kind() + if int(k) >= len(r.nodeRendererFuncs) { + return s, fmt.Errorf("unrecognized node kind %v cannot be rendered: "+ + "register a renderer for this node kind first", k) + } + + f := r.nodeRendererFuncs[k] if f != nil { s, err = f(writer, source, n, entering) } diff --git a/renderer/renderer_test.go b/renderer/renderer_test.go new file mode 100644 index 0000000..aa9ae3f --- /dev/null +++ b/renderer/renderer_test.go @@ -0,0 +1,25 @@ +package renderer + +import ( + "io/ioutil" + "strings" + "testing" + + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/text" +) + +func TestRenderUnknownNode(t *testing.T) { + src := []byte("# Foo\n\nHello world") + node := parser.NewParser().Parse(text.NewReader(src)) + + r := NewRenderer() + err := r.Render(ioutil.Discard, src, node) + if err == nil { + t.Fatalf("Render() expected error") + } + + if !strings.Contains(err.Error(), "unrecognized node kind Document") { + t.Errorf("Render() failed with unexpected error: %v", err) + } +}