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
5package gensupport
6
7import (
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.
23type JSONFloat64 float64
24
25func (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}
48