Better error on invalid map keys.
Closes #25.
diff --git a/decode.go b/decode.go
index 442f87d..deba771 100644
--- a/decode.go
+++ b/decode.go
@@ -2,6 +2,7 @@
import (
"encoding/base64"
+ "fmt"
"reflect"
"strconv"
"time"
@@ -485,6 +486,13 @@
}
k := reflect.New(kt).Elem()
if d.unmarshal(n.children[i], k) {
+ kkind := k.Kind()
+ if kkind == reflect.Interface {
+ kkind = k.Elem().Kind()
+ }
+ if kkind == reflect.Map || kkind == reflect.Slice {
+ fail(fmt.Sprintf("invalid map key: %#v", k.Interface()))
+ }
e := reflect.New(et).Elem()
if d.unmarshal(n.children[i+1], e) {
out.SetMapIndex(k, e)
diff --git a/decode_test.go b/decode_test.go
index cb68d4c..ef3d37f 100644
--- a/decode_test.go
+++ b/decode_test.go
@@ -453,6 +453,8 @@
{"a: &a\n b: *a\n", "YAML error: Anchor 'a' value contains itself"},
{"value: -", "YAML error: block sequence entries are not allowed in this context"},
{"a: !!binary ==", "YAML error: !!binary value contains invalid base64 data"},
+ {"{[.]}", `YAML error: invalid map key: \[\]interface \{\}\{"\."\}`},
+ {"{{.}}", `YAML error: invalid map key: map\[interface\ \{\}\]interface \{\}\{".":interface \{\}\(nil\)\}`},
}
func (s *S) TestUnmarshalErrors(c *C) {