Skip to content

Commit

Permalink
fix: add better support of array of floats
Browse files Browse the repository at this point in the history
Just like normal floats our arrary of floats should be able to
handle things like "NaN".

Fixes: googleapis#1970
  • Loading branch information
codyoss committed May 8, 2023
1 parent cf0df64 commit 64b82e4
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 3 deletions.
11 changes: 10 additions & 1 deletion google-api-go-generator/gen.go
Expand Up @@ -1477,7 +1477,8 @@ func (s *Schema) writeSchemaMarshal(forceSendFieldName, nullFieldsName string) {
func (s *Schema) writeSchemaUnmarshal() {
var floatProps []*Property
for _, p := range s.properties() {
if p.p.Schema.Type == "number" {
if p.p.Schema.Type == "number" ||
(p.p.Schema.Type == "array" && p.p.Schema.ItemSchema.Type == "number") {
floatProps = append(floatProps, p)
}
}
Expand All @@ -1495,6 +1496,9 @@ func (s *Schema) writeSchemaUnmarshal() {
if p.forcePointerType() {
typ = "*" + typ
}
if p.p.Schema.Type == "array" {
typ = "[]" + typ
}
pn("%s %s `json:\"%s\"`", p.assignedGoName, typ, p.p.Name)
}
pn(" *NoMethod") // embed the schema
Expand All @@ -1509,6 +1513,11 @@ func (s *Schema) writeSchemaUnmarshal() {
n := p.assignedGoName
if p.forcePointerType() {
pn("if s1.%s != nil { s.%s = (*float64)(s1.%s) }", n, n, n)
} else if p.p.Schema.Type == "array" {
pn("s.%s = make([]float64, len(s1.%s))", n, n)
pn(" for i := range s1.%s {", n)
pn(" s.%s[i] = float64(s1.%s[i])", n, n)
pn("}")
} else {
pn("s.%s = float64(s1.%s)", n, n)
}
Expand Down
9 changes: 7 additions & 2 deletions google-api-go-generator/testdata/json-body.want
Expand Up @@ -1314,14 +1314,19 @@ func (s *GoogleCloudMlV1__ParameterSpec) MarshalJSON() ([]byte, error) {
func (s *GoogleCloudMlV1__ParameterSpec) UnmarshalJSON(data []byte) error {
type NoMethod GoogleCloudMlV1__ParameterSpec
var s1 struct {
MaxValue gensupport.JSONFloat64 `json:"maxValue"`
MinValue gensupport.JSONFloat64 `json:"minValue"`
DiscreteValues []gensupport.JSONFloat64 `json:"discreteValues"`
MaxValue gensupport.JSONFloat64 `json:"maxValue"`
MinValue gensupport.JSONFloat64 `json:"minValue"`
*NoMethod
}
s1.NoMethod = (*NoMethod)(s)
if err := json.Unmarshal(data, &s1); err != nil {
return err
}
s.DiscreteValues = make([]float64, len(s1.DiscreteValues))
for i := range s1.DiscreteValues {
s.DiscreteValues[i] = float64(s1.DiscreteValues[i])
}
s.MaxValue = float64(s1.MaxValue)
s.MinValue = float64(s1.MinValue)
return nil
Expand Down
51 changes: 51 additions & 0 deletions google-api-go-generator/testdata/variants.want
Expand Up @@ -475,6 +475,23 @@ func (s *MapFolder) MarshalJSON() ([]byte, error) {
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

func (s *MapFolder) UnmarshalJSON(data []byte) error {
type NoMethod MapFolder
var s1 struct {
DefaultViewport []gensupport.JSONFloat64 `json:"defaultViewport"`
*NoMethod
}
s1.NoMethod = (*NoMethod)(s)
if err := json.Unmarshal(data, &s1); err != nil {
return err
}
s.DefaultViewport = make([]float64, len(s1.DefaultViewport))
for i := range s1.DefaultViewport {
s.DefaultViewport[i] = float64(s1.DefaultViewport[i])
}
return nil
}

type MapItem map[string]interface{}

func (t MapItem) Type() string {
Expand Down Expand Up @@ -551,6 +568,23 @@ func (s *MapKmlLink) MarshalJSON() ([]byte, error) {
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

func (s *MapKmlLink) UnmarshalJSON(data []byte) error {
type NoMethod MapKmlLink
var s1 struct {
DefaultViewport []gensupport.JSONFloat64 `json:"defaultViewport"`
*NoMethod
}
s1.NoMethod = (*NoMethod)(s)
if err := json.Unmarshal(data, &s1); err != nil {
return err
}
s.DefaultViewport = make([]float64, len(s1.DefaultViewport))
for i := range s1.DefaultViewport {
s.DefaultViewport[i] = float64(s1.DefaultViewport[i])
}
return nil
}

type MapLayer struct {
// DefaultViewport: An array of four numbers (west, south, east, north)
// which defines the rectangular bounding box of the default viewport.
Expand Down Expand Up @@ -600,3 +634,20 @@ func (s *MapLayer) MarshalJSON() ([]byte, error) {
raw := NoMethod(*s)
return gensupport.MarshalJSON(raw, s.ForceSendFields, s.NullFields)
}

func (s *MapLayer) UnmarshalJSON(data []byte) error {
type NoMethod MapLayer
var s1 struct {
DefaultViewport []gensupport.JSONFloat64 `json:"defaultViewport"`
*NoMethod
}
s1.NoMethod = (*NoMethod)(s)
if err := json.Unmarshal(data, &s1); err != nil {
return err
}
s.DefaultViewport = make([]float64, len(s1.DefaultViewport))
for i := range s1.DefaultViewport {
s.DefaultViewport[i] = float64(s1.DefaultViewport[i])
}
return nil
}

0 comments on commit 64b82e4

Please sign in to comment.