109 lines
2.5 KiB
Go
109 lines
2.5 KiB
Go
|
// Copyright 2016 Google Inc. All Rights Reserved.
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
// Package optional provides versions of primitive types that can
|
||
|
// be nil. These are useful in methods that update some of an API object's
|
||
|
// fields.
|
||
|
package optional
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type (
|
||
|
// Bool is either a bool or nil.
|
||
|
Bool interface{}
|
||
|
|
||
|
// String is either a string or nil.
|
||
|
String interface{}
|
||
|
|
||
|
// Int is either an int or nil.
|
||
|
Int interface{}
|
||
|
|
||
|
// Uint is either a uint or nil.
|
||
|
Uint interface{}
|
||
|
|
||
|
// Float64 is either a float64 or nil.
|
||
|
Float64 interface{}
|
||
|
|
||
|
// Duration is either a time.Duration or nil.
|
||
|
Duration interface{}
|
||
|
)
|
||
|
|
||
|
// ToBool returns its argument as a bool.
|
||
|
// It panics if its argument is nil or not a bool.
|
||
|
func ToBool(v Bool) bool {
|
||
|
x, ok := v.(bool)
|
||
|
if !ok {
|
||
|
doPanic("Bool", v)
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
// ToString returns its argument as a string.
|
||
|
// It panics if its argument is nil or not a string.
|
||
|
func ToString(v String) string {
|
||
|
x, ok := v.(string)
|
||
|
if !ok {
|
||
|
doPanic("String", v)
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
// ToInt returns its argument as an int.
|
||
|
// It panics if its argument is nil or not an int.
|
||
|
func ToInt(v Int) int {
|
||
|
x, ok := v.(int)
|
||
|
if !ok {
|
||
|
doPanic("Int", v)
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
// ToUint returns its argument as a uint.
|
||
|
// It panics if its argument is nil or not a uint.
|
||
|
func ToUint(v Uint) uint {
|
||
|
x, ok := v.(uint)
|
||
|
if !ok {
|
||
|
doPanic("Uint", v)
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
// ToFloat64 returns its argument as a float64.
|
||
|
// It panics if its argument is nil or not a float64.
|
||
|
func ToFloat64(v Float64) float64 {
|
||
|
x, ok := v.(float64)
|
||
|
if !ok {
|
||
|
doPanic("Float64", v)
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
// ToDuration returns its argument as a time.Duration.
|
||
|
// It panics if its argument is nil or not a time.Duration.
|
||
|
func ToDuration(v Duration) time.Duration {
|
||
|
x, ok := v.(time.Duration)
|
||
|
if !ok {
|
||
|
doPanic("Duration", v)
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
func doPanic(capType string, v interface{}) {
|
||
|
panic(fmt.Sprintf("optional.%s value should be %s, got %T", capType, strings.ToLower(capType), v))
|
||
|
}
|