Explorar el Código

Behave gracefully when text formatting a map field with a nil value.

Fixes #33.
David Symonds hace 10 años
padre
commit
34a5f244f1
Se han modificado 2 ficheros con 20 adiciones y 12 borrados
  1. 15 12
      proto/text.go
  2. 5 0
      proto/text_test.go

+ 15 - 12
proto/text.go

@@ -283,20 +283,23 @@ func writeStruct(w *textWriter, sv reflect.Value) error {
 				if err := w.WriteByte('\n'); err != nil {
 					return err
 				}
-				// value
-				if _, err := w.WriteString("value:"); err != nil {
-					return err
-				}
-				if !w.compact {
-					if err := w.WriteByte(' '); err != nil {
+				// nil values aren't legal, but we can avoid panicking because of them.
+				if val.Kind() != reflect.Ptr || !val.IsNil() {
+					// value
+					if _, err := w.WriteString("value:"); err != nil {
+						return err
+					}
+					if !w.compact {
+						if err := w.WriteByte(' '); err != nil {
+							return err
+						}
+					}
+					if err := writeAny(w, val, props.mvalprop); err != nil {
+						return err
+					}
+					if err := w.WriteByte('\n'); err != nil {
 						return err
 					}
-				}
-				if err := writeAny(w, val, props.mvalprop); err != nil {
-					return err
-				}
-				if err := w.WriteByte('\n'); err != nil {
-					return err
 				}
 				// close struct
 				w.unindent()

+ 5 - 0
proto/text_test.go

@@ -426,6 +426,11 @@ func TestProto3Text(t *testing.T) {
 			&pb.MessageWithMap{NameMapping: map[int32]string{1234: "Feist"}},
 			`name_mapping:<key:1234 value:"Feist" >`,
 		},
+		// map with nil value; not well-defined, but we shouldn't crash
+		{
+			&pb.MessageWithMap{MsgMapping: map[int64]*pb.FloatingPoint{7: nil}},
+			`msg_mapping:<key:7 >`,
+		},
 	}
 	for _, test := range tests {
 		got := strings.TrimSpace(test.m.String())