| // Copyright 2016 Google LLC |
| // |
| // 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)) |
| } |