...

Source file src/google.golang.org/api/internal/gensupport/jsonfloat.go

Documentation: google.golang.org/api/internal/gensupport

     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  }
    48  

View as plain text