Skip to content

Commit 5b0bfab

Browse files
committed
Fix DynamoDB string accessor type check
1 parent 87e344b commit 5b0bfab

2 files changed

Lines changed: 16 additions & 7 deletions

File tree

events/attributevalue.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,13 @@ func (av DynamoDBAttributeValue) NumberSet() []string {
116116
// String provides access to an attribute of type String.
117117
// Method panics if the attribute is not of type String.
118118
func (av DynamoDBAttributeValue) String() string {
119-
if av.dataType == DataTypeString {
120-
return av.value.(string)
121-
}
122-
// If dataType is not DataTypeString during fmt.Sprintf("%#v", ...)
123-
// compiler confuses with fmt.Stringer interface and panics
124-
// instead of printing the struct.
125-
return fmt.Sprintf("%v", dynamoDbAttributeValue(av))
119+
av.ensureType(DataTypeString)
120+
return av.value.(string)
121+
}
122+
123+
// GoString formats the attribute value without calling the String accessor.
124+
func (av DynamoDBAttributeValue) GoString() string {
125+
return fmt.Sprintf("%#v", dynamoDbAttributeValue(av))
126126
}
127127

128128
// StringSet provides access to an attribute of type String Set.

events/attributevalue_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package events
55
import (
66
"encoding/base64"
77
"encoding/json"
8+
"fmt"
89
"testing"
910

1011
"github.com/stretchr/testify/assert"
@@ -206,6 +207,7 @@ func TestAccessWithWrongTypePanics(t *testing.T) {
206207
{`{ "N": "123.45"}`, func(av DynamoDBAttributeValue) { av.Boolean() }, IncompatibleDynamoDBTypeError{Requested: DataTypeBoolean, Actual: DataTypeNumber}},
207208
{`{ "NS": ["1234", "567.8"] }`, func(av DynamoDBAttributeValue) { av.Boolean() }, IncompatibleDynamoDBTypeError{Requested: DataTypeBoolean, Actual: DataTypeNumberSet}},
208209
{`{ "NULL": true}`, func(av DynamoDBAttributeValue) { av.Number() }, IncompatibleDynamoDBTypeError{Requested: DataTypeNumber, Actual: DataTypeNull}},
210+
{`{ "BOOL": true}`, func(av DynamoDBAttributeValue) { av.String() }, IncompatibleDynamoDBTypeError{Requested: DataTypeString, Actual: DataTypeBoolean}},
209211
{`{ "S": "Hello"}`, func(av DynamoDBAttributeValue) { av.Number() }, IncompatibleDynamoDBTypeError{Requested: DataTypeNumber, Actual: DataTypeString}},
210212
{`{ "SS": [ "Giraffe", "Zebra" ] }`, func(av DynamoDBAttributeValue) { av.Number() }, IncompatibleDynamoDBTypeError{Requested: DataTypeNumber, Actual: DataTypeStringSet}},
211213
}
@@ -219,6 +221,13 @@ func TestAccessWithWrongTypePanics(t *testing.T) {
219221
}
220222
}
221223

224+
func TestDynamoDBAttributeValueGoStringDoesNotCallStringAccessor(t *testing.T) {
225+
var av DynamoDBAttributeValue
226+
err := json.Unmarshal([]byte(`{ "BOOL": true}`), &av)
227+
assert.Nil(t, err)
228+
assert.NotPanics(t, func() { fmt.Sprintf("%#v", av) })
229+
}
230+
222231
func TestMarshalAndUnmarshalString(t *testing.T) {
223232
const inputString = "INPUT STRING"
224233
inputValue := NewStringAttribute(inputString)

0 commit comments

Comments
 (0)