// 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"
)

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{}
)

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

func doPanic(capType string, v interface{}) {
	panic(fmt.Sprintf("optional.%s value should be %s, got %T", capType, strings.ToLower(capType), v))
}
