Skip to content

Commit

Permalink
Merge pull request #369 from civist/scalar-nil-pointer-safety
Browse files Browse the repository at this point in the history
Scalar nil pointer safety
  • Loading branch information
chris-ramon committed Jul 27, 2018
2 parents 2b97f4c + 986ca8b commit a13937c
Show file tree
Hide file tree
Showing 3 changed files with 300 additions and 0 deletions.
135 changes: 135 additions & 0 deletions scalars.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,75 +22,114 @@ 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) {
return nil
}
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) {
return nil
}
return int(value)
case *int64:
if value == nil {
return nil
}
return coerceInt(*value)
case uint:
if value > math.MaxInt32 {
return nil
}
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) {
return nil
}
return int(value)
case *uint32:
if value == nil {
return nil
}
return coerceInt(*value)
case uint64:
if value > uint64(math.MaxInt32) {
return nil
}
return int(value)
case *uint64:
if value == nil {
return nil
}
return coerceInt(*value)
case float32:
if value < float32(math.MinInt32) || value > float32(math.MaxInt32) {
return nil
}
return int(value)
case *float32:
if value == nil {
return nil
}
return coerceInt(*value)
case float64:
if value < float64(math.MinInt32) || value > float64(math.MaxInt32) {
return nil
}
return int(value)
case *float64:
if value == nil {
return nil
}
return coerceInt(*value)
case string:
val, err := strconv.ParseFloat(value, 0)
Expand All @@ -99,6 +138,9 @@ func coerceInt(value interface{}) interface{} {
}
return coerceInt(val)
case *string:
if value == nil {
return nil
}
return coerceInt(*value)
}

Expand Down Expand Up @@ -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)
Expand All @@ -189,6 +270,9 @@ func coerceFloat(value interface{}) interface{} {
}
return val
case *string:
if value == nil {
return nil
}
return coerceFloat(*value)
}

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 {
Expand All @@ -257,90 +347,129 @@ func coerceBool(value interface{}) interface{} {
}
return true
case *string:
if value == nil {
return nil
}
return coerceBool(*value)
case float64:
if value != 0 {
return true
}
return false
case *float64:
if value == nil {
return nil
}
return coerceBool(*value)
case float32:
if value != 0 {
return true
}
return false
case *float32:
if value == nil {
return nil
}
return coerceBool(*value)
case int:
if value != 0 {
return true
}
return false
case *int:
if value == nil {
return nil
}
return coerceBool(*value)
case int8:
if value != 0 {
return true
}
return false
case *int8:
if value == nil {
return nil
}
return coerceBool(*value)
case int16:
if value != 0 {
return true
}
return false
case *int16:
if value == nil {
return nil
}
return coerceBool(*value)
case int32:
if value != 0 {
return true
}
return false
case *int32:
if value == nil {
return nil
}
return coerceBool(*value)
case int64:
if value != 0 {
return true
}
return false
case *int64:
if value == nil {
return nil
}
return coerceBool(*value)
case uint:
if value != 0 {
return true
}
return false
case *uint:
if value == nil {
return nil
}
return coerceBool(*value)
case uint8:
if value != 0 {
return true
}
return false
case *uint8:
if value == nil {
return nil
}
return coerceBool(*value)
case uint16:
if value != 0 {
return true
}
return false
case *uint16:
if value == nil {
return nil
}
return coerceBool(*value)
case uint32:
if value != 0 {
return true
}
return false
case *uint32:
if value == nil {
return nil
}
return coerceBool(*value)
case uint64:
if value != 0 {
return true
}
return false
case *uint64:
if value == nil {
return nil
}
return coerceBool(*value)
}
return false
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
Loading

0 comments on commit a13937c

Please sign in to comment.