func writeField(first bool, b *bytes.Buffer, f *message.Field, raw bool) { if !first { b.WriteString(`,`) } writeQuotedString(b, f.GetName()) b.WriteString(`:`) switch f.GetValueType() { case message.Field_STRING: values := f.GetValueString() if len(values) > 1 { b.WriteString(`[`) for i, value := range values { if raw { b.WriteString(value) } else { writeQuotedString(b, value) } if i < len(values)-1 { b.WriteString(`,`) } } b.WriteString(`]`) } else { if raw { b.WriteString(values[0]) } else { writeQuotedString(b, values[0]) } } case message.Field_BYTES: values := f.GetValueBytes() if len(values) > 1 { b.WriteString(`[`) for i, value := range values { if raw { b.WriteString(string(value)) } else { writeQuotedString(b, base64.StdEncoding.EncodeToString(value)) } if i < len(values)-1 { b.WriteString(`,`) } } b.WriteString(`]`) } else { if raw { b.WriteString(string(values[0])) } else { writeQuotedString(b, string(values[0])) } } case message.Field_INTEGER: values := f.GetValueInteger() if len(values) > 1 { b.WriteString(`[`) for i, value := range values { b.WriteString(strconv.FormatInt(value, 10)) if i < len(values)-1 { b.WriteString(`,`) } } b.WriteString(`]`) } else { b.WriteString(strconv.FormatInt(values[0], 10)) } case message.Field_DOUBLE: values := f.GetValueDouble() if len(values) > 1 { b.WriteString(`[`) for i, value := range values { b.WriteString(strconv.FormatFloat(value, 'g', -1, 64)) if i < len(values)-1 { b.WriteString(`,`) } } b.WriteString(`]`) } else { b.WriteString(strconv.FormatFloat(values[0], 'g', -1, 64)) } case message.Field_BOOL: values := f.GetValueBool() if len(values) > 1 { b.WriteString(`[`) for i, value := range values { b.WriteString(strconv.FormatBool(value)) if i < len(values)-1 { b.WriteString(`,`) } } b.WriteString(`]`) } else { b.WriteString(strconv.FormatBool(values[0])) } } }