diff --git a/scalars.go b/scalars.go index 1dc62fef..9131f802 100644 --- a/scalars.go +++ b/scalars.go @@ -22,6 +22,9 @@ func coerceInt(value interface{}) interface{} { } return 0 case *bool: + if value == nil { + return nil + } return coerceInt(*value) case int: if value < int(math.MinInt32) || value > int(math.MaxInt32) { @@ -29,18 +32,30 @@ func coerceInt(value interface{}) interface{} { } return value case *int: + if value == nil { + return nil + } return coerceInt(*value) case int8: return int(value) case *int8: + if value == nil { + return nil + } return int(*value) case int16: return int(value) case *int16: + if value == nil { + return nil + } return int(*value) case int32: return int(value) case *int32: + if value == nil { + return nil + } return int(*value) case int64: if value < int64(math.MinInt32) || value > int64(math.MaxInt32) { @@ -48,6 +63,9 @@ func coerceInt(value interface{}) interface{} { } return int(value) case *int64: + if value == nil { + return nil + } return coerceInt(*value) case uint: if value > math.MaxInt32 { @@ -55,14 +73,23 @@ func coerceInt(value interface{}) interface{} { } return int(value) case *uint: + if value == nil { + return nil + } return coerceInt(*value) case uint8: return int(value) case *uint8: + if value == nil { + return nil + } return int(*value) case uint16: return int(value) case *uint16: + if value == nil { + return nil + } return int(*value) case uint32: if value > uint32(math.MaxInt32) { @@ -70,6 +97,9 @@ func coerceInt(value interface{}) interface{} { } return int(value) case *uint32: + if value == nil { + return nil + } return coerceInt(*value) case uint64: if value > uint64(math.MaxInt32) { @@ -77,6 +107,9 @@ func coerceInt(value interface{}) interface{} { } return int(value) case *uint64: + if value == nil { + return nil + } return coerceInt(*value) case float32: if value < float32(math.MinInt32) || value > float32(math.MaxInt32) { @@ -84,6 +117,9 @@ func coerceInt(value interface{}) interface{} { } return int(value) case *float32: + if value == nil { + return nil + } return coerceInt(*value) case float64: if value < float64(math.MinInt32) || value > float64(math.MaxInt32) { @@ -91,6 +127,9 @@ func coerceInt(value interface{}) interface{} { } return int(value) case *float64: + if value == nil { + return nil + } return coerceInt(*value) case string: val, err := strconv.ParseFloat(value, 0) @@ -99,6 +138,9 @@ func coerceInt(value interface{}) interface{} { } return coerceInt(val) case *string: + if value == nil { + return nil + } return coerceInt(*value) } @@ -133,54 +175,93 @@ func coerceFloat(value interface{}) interface{} { } return 0.0 case *bool: + if value == nil { + return nil + } return coerceFloat(*value) case int: return float64(value) case *int: + if value == nil { + return nil + } return coerceFloat(*value) case int8: return float64(value) case *int8: + if value == nil { + return nil + } return coerceFloat(*value) case int16: return float64(value) case *int16: + if value == nil { + return nil + } return coerceFloat(*value) case int32: return float64(value) case *int32: + if value == nil { + return nil + } return coerceFloat(*value) case int64: return float64(value) case *int64: + if value == nil { + return nil + } return coerceFloat(*value) case uint: return float64(value) case *uint: + if value == nil { + return nil + } return coerceFloat(*value) case uint8: return float64(value) case *uint8: + if value == nil { + return nil + } return coerceFloat(*value) case uint16: return float64(value) case *uint16: + if value == nil { + return nil + } return coerceFloat(*value) case uint32: return float64(value) case *uint32: + if value == nil { + return nil + } return coerceFloat(*value) case uint64: return float64(value) case *uint64: + if value == nil { + return nil + } return coerceFloat(*value) case float32: return value case *float32: + if value == nil { + return nil + } return coerceFloat(*value) case float64: return value case *float64: + if value == nil { + return nil + } return coerceFloat(*value) case string: val, err := strconv.ParseFloat(value, 0) @@ -189,6 +270,9 @@ func coerceFloat(value interface{}) interface{} { } return val case *string: + if value == nil { + return nil + } return coerceFloat(*value) } @@ -222,6 +306,9 @@ var Float = NewScalar(ScalarConfig{ func coerceString(value interface{}) interface{} { if v, ok := value.(*string); ok { + if v == nil { + return nil + } return *v } return fmt.Sprintf("%v", value) @@ -249,6 +336,9 @@ func coerceBool(value interface{}) interface{} { case bool: return value case *bool: + if value == nil { + return nil + } return *value case string: switch value { @@ -257,6 +347,9 @@ func coerceBool(value interface{}) interface{} { } return true case *string: + if value == nil { + return nil + } return coerceBool(*value) case float64: if value != 0 { @@ -264,6 +357,9 @@ func coerceBool(value interface{}) interface{} { } return false case *float64: + if value == nil { + return nil + } return coerceBool(*value) case float32: if value != 0 { @@ -271,6 +367,9 @@ func coerceBool(value interface{}) interface{} { } return false case *float32: + if value == nil { + return nil + } return coerceBool(*value) case int: if value != 0 { @@ -278,6 +377,9 @@ func coerceBool(value interface{}) interface{} { } return false case *int: + if value == nil { + return nil + } return coerceBool(*value) case int8: if value != 0 { @@ -285,6 +387,9 @@ func coerceBool(value interface{}) interface{} { } return false case *int8: + if value == nil { + return nil + } return coerceBool(*value) case int16: if value != 0 { @@ -292,6 +397,9 @@ func coerceBool(value interface{}) interface{} { } return false case *int16: + if value == nil { + return nil + } return coerceBool(*value) case int32: if value != 0 { @@ -299,6 +407,9 @@ func coerceBool(value interface{}) interface{} { } return false case *int32: + if value == nil { + return nil + } return coerceBool(*value) case int64: if value != 0 { @@ -306,6 +417,9 @@ func coerceBool(value interface{}) interface{} { } return false case *int64: + if value == nil { + return nil + } return coerceBool(*value) case uint: if value != 0 { @@ -313,6 +427,9 @@ func coerceBool(value interface{}) interface{} { } return false case *uint: + if value == nil { + return nil + } return coerceBool(*value) case uint8: if value != 0 { @@ -320,6 +437,9 @@ func coerceBool(value interface{}) interface{} { } return false case *uint8: + if value == nil { + return nil + } return coerceBool(*value) case uint16: if value != 0 { @@ -327,6 +447,9 @@ func coerceBool(value interface{}) interface{} { } return false case *uint16: + if value == nil { + return nil + } return coerceBool(*value) case uint32: if value != 0 { @@ -334,6 +457,9 @@ func coerceBool(value interface{}) interface{} { } return false case *uint32: + if value == nil { + return nil + } return coerceBool(*value) case uint64: if value != 0 { @@ -341,6 +467,9 @@ func coerceBool(value interface{}) interface{} { } return false case *uint64: + if value == nil { + return nil + } return coerceBool(*value) } return false @@ -392,6 +521,9 @@ func serializeDateTime(value interface{}) interface{} { return string(buff) case *time.Time: + if value == nil { + return nil + } return serializeDateTime(*value) default: return nil @@ -411,6 +543,9 @@ func unserializeDateTime(value interface{}) interface{} { case string: return unserializeDateTime([]byte(value)) case *string: + if value == nil { + return nil + } return unserializeDateTime([]byte(*value)) default: return nil diff --git a/scalars_parsevalue_test.go b/scalars_parsevalue_test.go index bdc4140d..c04d6a3b 100644 --- a/scalars_parsevalue_test.go +++ b/scalars_parsevalue_test.go @@ -13,6 +13,7 @@ func TestTypeSystem_Scalar_ParseValueOutputDateTime(t *testing.T) { tests := []dateTimeSerializationTest{ {nil, nil}, {"", nil}, + {(*string)(nil), nil}, {"2017-07-23", nil}, {"2017-07-23T03:46:56.647Z", t1}, } diff --git a/scalars_test.go b/scalars_test.go index fb136696..26987e5c 100644 --- a/scalars_test.go +++ b/scalars_test.go @@ -26,6 +26,10 @@ func TestCoerceInt(t *testing.T) { in: boolPtr(true), want: 1, }, + { + in: (*bool)(nil), + want: nil, + }, { in: int(math.MinInt32) - 1, want: nil, @@ -84,6 +88,10 @@ func TestCoerceInt(t *testing.T) { in: intPtr(12), want: 12, }, + { + in: (*int)(nil), + want: nil, + }, { in: int8(13), want: int(13), @@ -92,6 +100,10 @@ func TestCoerceInt(t *testing.T) { in: int8Ptr(14), want: int(14), }, + { + in: (*int8)(nil), + want: nil, + }, { in: int16(15), want: int(15), @@ -100,6 +112,10 @@ func TestCoerceInt(t *testing.T) { in: int16Ptr(16), want: int(16), }, + { + in: (*int16)(nil), + want: nil, + }, { in: int32(17), want: int(17), @@ -108,6 +124,10 @@ func TestCoerceInt(t *testing.T) { in: int32Ptr(18), want: int(18), }, + { + in: (*int32)(nil), + want: nil, + }, { in: int64(19), want: int(19), @@ -116,6 +136,10 @@ func TestCoerceInt(t *testing.T) { in: int64Ptr(20), want: int(20), }, + { + in: (*int64)(nil), + want: nil, + }, { in: uint8(21), want: int(21), @@ -124,6 +148,10 @@ func TestCoerceInt(t *testing.T) { in: uint8Ptr(22), want: int(22), }, + { + in: (*uint8)(nil), + want: nil, + }, { in: uint16(23), want: int(23), @@ -132,6 +160,10 @@ func TestCoerceInt(t *testing.T) { in: uint16Ptr(24), want: int(24), }, + { + in: (*uint16)(nil), + want: nil, + }, { in: uint32(25), want: int(25), @@ -140,6 +172,10 @@ func TestCoerceInt(t *testing.T) { in: uint32Ptr(26), want: int(26), }, + { + in: (*uint32)(nil), + want: nil, + }, { in: uint64(27), want: int(27), @@ -148,10 +184,18 @@ func TestCoerceInt(t *testing.T) { in: uint64Ptr(28), want: int(28), }, + { + in: (*uint64)(nil), + want: nil, + }, { in: uintPtr(29), want: int(29), }, + { + in: (*uint)(nil), + want: nil, + }, { in: float32(30.1), want: int(30), @@ -160,6 +204,10 @@ func TestCoerceInt(t *testing.T) { in: float32Ptr(31.2), want: int(31), }, + { + in: (*float32)(nil), + want: nil, + }, { in: float64(32), want: int(32), @@ -168,6 +216,10 @@ func TestCoerceInt(t *testing.T) { in: float64Ptr(33.1), want: int(33), }, + { + in: (*float64)(nil), + want: nil, + }, { in: "34", want: int(34), @@ -176,6 +228,10 @@ func TestCoerceInt(t *testing.T) { in: stringPtr("35"), want: int(35), }, + { + in: (*string)(nil), + want: nil, + }, { in: "I'm not a number", want: nil, @@ -214,6 +270,10 @@ func TestCoerceFloat(t *testing.T) { in: boolPtr(true), want: 1.0, }, + { + in: (*bool)(nil), + want: nil, + }, { in: int(math.MinInt32), want: float64(math.MinInt32), @@ -226,6 +286,10 @@ func TestCoerceFloat(t *testing.T) { in: intPtr(12), want: float64(12), }, + { + in: (*int)(nil), + want: nil, + }, { in: int8(13), want: float64(13), @@ -234,6 +298,10 @@ func TestCoerceFloat(t *testing.T) { in: int8Ptr(14), want: float64(14), }, + { + in: (*int8)(nil), + want: nil, + }, { in: int16(15), want: float64(15), @@ -242,6 +310,10 @@ func TestCoerceFloat(t *testing.T) { in: int16Ptr(16), want: float64(16), }, + { + in: (*int16)(nil), + want: nil, + }, { in: int32(17), want: float64(17), @@ -250,6 +322,10 @@ func TestCoerceFloat(t *testing.T) { in: int32Ptr(18), want: float64(18), }, + { + in: (*int32)(nil), + want: nil, + }, { in: int64(19), want: float64(19), @@ -258,6 +334,10 @@ func TestCoerceFloat(t *testing.T) { in: int64Ptr(20), want: float64(20), }, + { + in: (*int64)(nil), + want: nil, + }, { in: uint8(21), want: float64(21), @@ -266,6 +346,10 @@ func TestCoerceFloat(t *testing.T) { in: uint8Ptr(22), want: float64(22), }, + { + in: (*uint8)(nil), + want: nil, + }, { in: uint16(23), want: float64(23), @@ -274,6 +358,10 @@ func TestCoerceFloat(t *testing.T) { in: uint16Ptr(24), want: float64(24), }, + { + in: (*uint16)(nil), + want: nil, + }, { in: uint32(25), want: float64(25), @@ -282,6 +370,10 @@ func TestCoerceFloat(t *testing.T) { in: uint32Ptr(26), want: float64(26), }, + { + in: (*uint32)(nil), + want: nil, + }, { in: uint64(27), want: float64(27), @@ -290,10 +382,18 @@ func TestCoerceFloat(t *testing.T) { in: uint64Ptr(28), want: float64(28), }, + { + in: (*uint64)(nil), + want: nil, + }, { in: uintPtr(29), want: float64(29), }, + { + in: (*uint)(nil), + want: nil, + }, { in: float32(30), want: float32(30), @@ -302,6 +402,10 @@ func TestCoerceFloat(t *testing.T) { in: float32Ptr(31), want: float32(31), }, + { + in: (*float32)(nil), + want: nil, + }, { in: float64(32), want: float64(32), @@ -310,6 +414,10 @@ func TestCoerceFloat(t *testing.T) { in: float64Ptr(33.2), want: float64(33.2), }, + { + in: (*float64)(nil), + want: nil, + }, { in: "34", want: float64(34), @@ -318,6 +426,10 @@ func TestCoerceFloat(t *testing.T) { in: stringPtr("35.2"), want: float64(35.2), }, + { + in: (*string)(nil), + want: nil, + }, { in: "I'm not a number", want: nil, @@ -356,6 +468,10 @@ func TestCoerceBool(t *testing.T) { in: boolPtr(true), want: true, }, + { + in: (*bool)(nil), + want: nil, + }, { in: int(math.MinInt32), want: true, @@ -376,6 +492,10 @@ func TestCoerceBool(t *testing.T) { in: intPtr(0), want: false, }, + { + in: (*int)(nil), + want: nil, + }, { in: int8(13), want: true, @@ -392,6 +512,10 @@ func TestCoerceBool(t *testing.T) { in: int8Ptr(0), want: false, }, + { + in: (*int8)(nil), + want: nil, + }, { in: int16(15), want: true, @@ -408,6 +532,10 @@ func TestCoerceBool(t *testing.T) { in: int16Ptr(0), want: false, }, + { + in: (*int16)(nil), + want: nil, + }, { in: int32(17), want: true, @@ -424,6 +552,10 @@ func TestCoerceBool(t *testing.T) { in: int32Ptr(0), want: false, }, + { + in: (*int32)(nil), + want: nil, + }, { in: int64(19), want: true, @@ -440,6 +572,10 @@ func TestCoerceBool(t *testing.T) { in: int64Ptr(0), want: false, }, + { + in: (*int64)(nil), + want: nil, + }, { in: uint8(21), want: true, @@ -456,6 +592,10 @@ func TestCoerceBool(t *testing.T) { in: uint8Ptr(0), want: false, }, + { + in: (*uint8)(nil), + want: nil, + }, { in: uint16(23), want: true, @@ -472,6 +612,10 @@ func TestCoerceBool(t *testing.T) { in: uint16Ptr(0), want: false, }, + { + in: (*uint16)(nil), + want: nil, + }, { in: uint32(25), want: true, @@ -488,6 +632,10 @@ func TestCoerceBool(t *testing.T) { in: uint32Ptr(0), want: false, }, + { + in: (*uint32)(nil), + want: nil, + }, { in: uint64(27), want: true, @@ -504,6 +652,10 @@ func TestCoerceBool(t *testing.T) { in: uint64Ptr(0), want: false, }, + { + in: (*uint64)(nil), + want: nil, + }, { in: uintPtr(29), want: true, @@ -528,6 +680,10 @@ func TestCoerceBool(t *testing.T) { in: float32Ptr(0), want: false, }, + { + in: (*float32)(nil), + want: nil, + }, { in: float64(32), want: true, @@ -544,6 +700,10 @@ func TestCoerceBool(t *testing.T) { in: float64Ptr(0), want: false, }, + { + in: (*float64)(nil), + want: nil, + }, { in: "34", want: true, @@ -560,6 +720,10 @@ func TestCoerceBool(t *testing.T) { in: stringPtr("false"), want: false, }, + { + in: (*string)(nil), + want: nil, + }, { in: "I'm some random string", want: true,