@@ -3,6 +3,7 @@ package apijson
33import (
44 "context"
55 "encoding/json"
6+ "errors"
67 "fmt"
78 "math/big"
89 "reflect"
@@ -19,6 +20,7 @@ import (
1920 "github.com/tidwall/gjson"
2021
2122 "github.com/hanzoai/terraform-provider-hanzo/internal/customfield"
23+ type_helpers "github.com/hanzoai/terraform-provider-hanzo/internal/types"
2224)
2325
2426// decoders is a synchronized map with roughly the following type:
@@ -478,23 +480,44 @@ func (d *decoderBuilder) newTerraformTypeDecoder(t reflect.Type) decoderFunc {
478480
479481 if (t == reflect .TypeOf (basetypes.Float64Value {})) {
480482 return d .decodeTerraformPrimitive (func () any { return types .Float64Null () }, func (node gjson.Result , value reflect.Value , state * decoderState ) error {
481- // use ParseFloat just to validate that it's a valid number
482- _ , err := strconv .ParseFloat (node .Str , 64 )
483- if node .Type == gjson .JSON || (node .Type == gjson .String && err != nil ) {
484- return fmt .Errorf ("apijson: failed to parse types.Float64Value" )
483+ var rawVal string
484+ switch node .Type {
485+ case gjson .String :
486+ rawVal = node .Str
487+ case gjson .Number :
488+ rawVal = node .Raw
489+ default :
490+ return errors .New ("apijson: failed to parse as basetypes.Float64Value" )
485491 }
486- value .Set (reflect .ValueOf (types .Float64Value (node .Float ())))
492+
493+ f64Val , err := type_helpers .NewFloat64ValueFromString (rawVal )
494+ if err != nil {
495+ return fmt .Errorf ("apijson: %w" , err )
496+ }
497+
498+ value .Set (reflect .ValueOf (f64Val ))
487499 return nil
488500 })
489501 }
490502
491503 if (t == reflect .TypeOf (basetypes.NumberValue {})) {
492504 return d .decodeTerraformPrimitive (func () any { return types .NumberNull () }, func (node gjson.Result , value reflect.Value , state * decoderState ) error {
493- value .Set (reflect .ValueOf (types .NumberValue (big .NewFloat (node .Float ()))))
494- _ , err := strconv .ParseFloat (node .Str , 64 )
495- if node .Type == gjson .JSON || (node .Type == gjson .String && err != nil ) {
496- return fmt .Errorf ("apijson: failed to parse types.Float64Value" )
505+ var rawVal string
506+ switch node .Type {
507+ case gjson .String :
508+ rawVal = node .Str
509+ case gjson .Number :
510+ rawVal = node .Raw
511+ default :
512+ return errors .New ("apijson: failed to parse as basetypes.NumberValue" )
497513 }
514+
515+ numberVal , err := type_helpers .NewNumberValueFromString (rawVal )
516+ if err != nil {
517+ return fmt .Errorf ("apijson: %w" , err )
518+ }
519+
520+ value .Set (reflect .ValueOf (numberVal ))
498521 return nil
499522 })
500523 }
@@ -1350,7 +1373,7 @@ func (d *decoderBuilder) inferTerraformAttrFromValue(node gjson.Result) (attr.Va
13501373 if err == nil {
13511374 return types .Int64Value (node .Int ()), nil
13521375 }
1353- return types . Float64Value (node .Float ()), nil
1376+ return type_helpers . NewFloat64ValueFromString (node .String ())
13541377 case gjson .String :
13551378 return types .StringValue (node .String ()), nil
13561379 case gjson .JSON :
0 commit comments