go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/common/api/internal/gensupport/jsonfloat.go (about) 1 // Copyright 2016 Google LLC. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package gensupport 6 7 import ( 8 "encoding/json" 9 "errors" 10 "fmt" 11 "math" 12 ) 13 14 // JSONFloat64 is a float64 that supports proper unmarshaling of special float 15 // values in JSON, according to 16 // https://developers.google.com/protocol-buffers/docs/proto3#json. Although 17 // that is a proto-to-JSON spec, it applies to all Google APIs. 18 // 19 // The jsonpb package 20 // (https://github.com/golang/protobuf/blob/master/jsonpb/jsonpb.go) has 21 // similar functionality, but only for direct translation from proto messages 22 // to JSON. 23 type JSONFloat64 float64 24 25 func (f *JSONFloat64) UnmarshalJSON(data []byte) error { 26 var ff float64 27 if err := json.Unmarshal(data, &ff); err == nil { 28 *f = JSONFloat64(ff) 29 return nil 30 } 31 var s string 32 if err := json.Unmarshal(data, &s); err == nil { 33 switch s { 34 case "NaN": 35 ff = math.NaN() 36 case "Infinity": 37 ff = math.Inf(1) 38 case "-Infinity": 39 ff = math.Inf(-1) 40 default: 41 return fmt.Errorf("google.golang.org/api/internal: bad float string %q", s) 42 } 43 *f = JSONFloat64(ff) 44 return nil 45 } 46 return errors.New("google.golang.org/api/internal: data not float or string") 47 }