| // Copyright 2016 Google LLC. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package gensupport | |
| import ( | |
| "encoding/json" | |
| "errors" | |
| "fmt" | |
| "math" | |
| ) | |
| // JSONFloat64 is a float64 that supports proper unmarshaling of special float | |
| // values in JSON, according to | |
| // https://developers.google.com/protocol-buffers/docs/proto3#json. Although | |
| // that is a proto-to-JSON spec, it applies to all Google APIs. | |
| // | |
| // The jsonpb package | |
| // (https://github.com/golang/protobuf/blob/master/jsonpb/jsonpb.go) has | |
| // similar functionality, but only for direct translation from proto messages | |
| // to JSON. | |
| type JSONFloat64 float64 | |
| func (f *JSONFloat64) UnmarshalJSON(data []byte) error { | |
| var ff float64 | |
| if err := json.Unmarshal(data, &ff); err == nil { | |
| *f = JSONFloat64(ff) | |
| return nil | |
| } | |
| var s string | |
| if err := json.Unmarshal(data, &s); err == nil { | |
| switch s { | |
| case "NaN": | |
| ff = math.NaN() | |
| case "Infinity": | |
| ff = math.Inf(1) | |
| case "-Infinity": | |
| ff = math.Inf(-1) | |
| default: | |
| return fmt.Errorf("google.golang.org/api/internal: bad float string %q", s) | |
| } | |
| *f = JSONFloat64(ff) | |
| return nil | |
| } | |
| return errors.New("google.golang.org/api/internal: data not float or string") | |
| } |