|  | // Copyright 2013 Google LLC. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | package googleapi | 
|  |  | 
|  | import ( | 
|  | "encoding/json" | 
|  | "errors" | 
|  | "strconv" | 
|  | ) | 
|  |  | 
|  | // Int64s is a slice of int64s that marshal as quoted strings in JSON. | 
|  | type Int64s []int64 | 
|  |  | 
|  | func (q *Int64s) UnmarshalJSON(raw []byte) error { | 
|  | *q = (*q)[:0] | 
|  | var ss []string | 
|  | if err := json.Unmarshal(raw, &ss); err != nil { | 
|  | return err | 
|  | } | 
|  | for _, s := range ss { | 
|  | v, err := strconv.ParseInt(s, 10, 64) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | *q = append(*q, int64(v)) | 
|  | } | 
|  | return nil | 
|  | } | 
|  |  | 
|  | // Int32s is a slice of int32s that marshal as quoted strings in JSON. | 
|  | type Int32s []int32 | 
|  |  | 
|  | func (q *Int32s) UnmarshalJSON(raw []byte) error { | 
|  | *q = (*q)[:0] | 
|  | var ss []string | 
|  | if err := json.Unmarshal(raw, &ss); err != nil { | 
|  | return err | 
|  | } | 
|  | for _, s := range ss { | 
|  | v, err := strconv.ParseInt(s, 10, 32) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | *q = append(*q, int32(v)) | 
|  | } | 
|  | return nil | 
|  | } | 
|  |  | 
|  | // Uint64s is a slice of uint64s that marshal as quoted strings in JSON. | 
|  | type Uint64s []uint64 | 
|  |  | 
|  | func (q *Uint64s) UnmarshalJSON(raw []byte) error { | 
|  | *q = (*q)[:0] | 
|  | var ss []string | 
|  | if err := json.Unmarshal(raw, &ss); err != nil { | 
|  | return err | 
|  | } | 
|  | for _, s := range ss { | 
|  | v, err := strconv.ParseUint(s, 10, 64) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | *q = append(*q, uint64(v)) | 
|  | } | 
|  | return nil | 
|  | } | 
|  |  | 
|  | // Uint32s is a slice of uint32s that marshal as quoted strings in JSON. | 
|  | type Uint32s []uint32 | 
|  |  | 
|  | func (q *Uint32s) UnmarshalJSON(raw []byte) error { | 
|  | *q = (*q)[:0] | 
|  | var ss []string | 
|  | if err := json.Unmarshal(raw, &ss); err != nil { | 
|  | return err | 
|  | } | 
|  | for _, s := range ss { | 
|  | v, err := strconv.ParseUint(s, 10, 32) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | *q = append(*q, uint32(v)) | 
|  | } | 
|  | return nil | 
|  | } | 
|  |  | 
|  | // Float64s is a slice of float64s that marshal as quoted strings in JSON. | 
|  | type Float64s []float64 | 
|  |  | 
|  | func (q *Float64s) UnmarshalJSON(raw []byte) error { | 
|  | *q = (*q)[:0] | 
|  | var ss []string | 
|  | if err := json.Unmarshal(raw, &ss); err != nil { | 
|  | return err | 
|  | } | 
|  | for _, s := range ss { | 
|  | v, err := strconv.ParseFloat(s, 64) | 
|  | if err != nil { | 
|  | return err | 
|  | } | 
|  | *q = append(*q, float64(v)) | 
|  | } | 
|  | return nil | 
|  | } | 
|  |  | 
|  | func quotedList(n int, fn func(dst []byte, i int) []byte) ([]byte, error) { | 
|  | dst := make([]byte, 0, 2+n*10) // somewhat arbitrary | 
|  | dst = append(dst, '[') | 
|  | for i := 0; i < n; i++ { | 
|  | if i > 0 { | 
|  | dst = append(dst, ',') | 
|  | } | 
|  | dst = append(dst, '"') | 
|  | dst = fn(dst, i) | 
|  | dst = append(dst, '"') | 
|  | } | 
|  | dst = append(dst, ']') | 
|  | return dst, nil | 
|  | } | 
|  |  | 
|  | func (q Int64s) MarshalJSON() ([]byte, error) { | 
|  | return quotedList(len(q), func(dst []byte, i int) []byte { | 
|  | return strconv.AppendInt(dst, q[i], 10) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func (q Int32s) MarshalJSON() ([]byte, error) { | 
|  | return quotedList(len(q), func(dst []byte, i int) []byte { | 
|  | return strconv.AppendInt(dst, int64(q[i]), 10) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func (q Uint64s) MarshalJSON() ([]byte, error) { | 
|  | return quotedList(len(q), func(dst []byte, i int) []byte { | 
|  | return strconv.AppendUint(dst, q[i], 10) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func (q Uint32s) MarshalJSON() ([]byte, error) { | 
|  | return quotedList(len(q), func(dst []byte, i int) []byte { | 
|  | return strconv.AppendUint(dst, uint64(q[i]), 10) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func (q Float64s) MarshalJSON() ([]byte, error) { | 
|  | return quotedList(len(q), func(dst []byte, i int) []byte { | 
|  | return strconv.AppendFloat(dst, q[i], 'g', -1, 64) | 
|  | }) | 
|  | } | 
|  |  | 
|  | // RawMessage is a raw encoded JSON value. | 
|  | // It is identical to json.RawMessage, except it does not suffer from | 
|  | // https://golang.org/issue/14493. | 
|  | type RawMessage []byte | 
|  |  | 
|  | // MarshalJSON returns m. | 
|  | func (m RawMessage) MarshalJSON() ([]byte, error) { | 
|  | return m, nil | 
|  | } | 
|  |  | 
|  | // UnmarshalJSON sets *m to a copy of data. | 
|  | func (m *RawMessage) UnmarshalJSON(data []byte) error { | 
|  | if m == nil { | 
|  | return errors.New("googleapi.RawMessage: UnmarshalJSON on nil pointer") | 
|  | } | 
|  | *m = append((*m)[:0], data...) | 
|  | return nil | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Helper routines for simplifying the creation of optional fields of basic type. | 
|  | */ | 
|  |  | 
|  | // Bool is a helper routine that allocates a new bool value | 
|  | // to store v and returns a pointer to it. | 
|  | func Bool(v bool) *bool { return &v } | 
|  |  | 
|  | // Int32 is a helper routine that allocates a new int32 value | 
|  | // to store v and returns a pointer to it. | 
|  | func Int32(v int32) *int32 { return &v } | 
|  |  | 
|  | // Int64 is a helper routine that allocates a new int64 value | 
|  | // to store v and returns a pointer to it. | 
|  | func Int64(v int64) *int64 { return &v } | 
|  |  | 
|  | // Float64 is a helper routine that allocates a new float64 value | 
|  | // to store v and returns a pointer to it. | 
|  | func Float64(v float64) *float64 { return &v } | 
|  |  | 
|  | // Uint32 is a helper routine that allocates a new uint32 value | 
|  | // to store v and returns a pointer to it. | 
|  | func Uint32(v uint32) *uint32 { return &v } | 
|  |  | 
|  | // Uint64 is a helper routine that allocates a new uint64 value | 
|  | // to store v and returns a pointer to it. | 
|  | func Uint64(v uint64) *uint64 { return &v } | 
|  |  | 
|  | // String is a helper routine that allocates a new string value | 
|  | // to store v and returns a pointer to it. | 
|  | func String(v string) *string { return &v } |