Path: blob/main/vendor/github.com/spf13/cast/basic.go
2875 views
// Copyright © 2014 Steve Francia <[email protected]>.1//2// Use of this source code is governed by an MIT-style3// license that can be found in the LICENSE file.45package cast67import (8"encoding/json"9"fmt"10"html/template"11"strconv"12"time"13)1415// ToBoolE casts any value to a bool type.16func ToBoolE(i any) (bool, error) {17i, _ = indirect(i)1819switch b := i.(type) {20case bool:21return b, nil22case nil:23return false, nil24case int:25return b != 0, nil26case int8:27return b != 0, nil28case int16:29return b != 0, nil30case int32:31return b != 0, nil32case int64:33return b != 0, nil34case uint:35return b != 0, nil36case uint8:37return b != 0, nil38case uint16:39return b != 0, nil40case uint32:41return b != 0, nil42case uint64:43return b != 0, nil44case float32:45return b != 0, nil46case float64:47return b != 0, nil48case time.Duration:49return b != 0, nil50case string:51return strconv.ParseBool(b)52case json.Number:53v, err := ToInt64E(b)54if err == nil {55return v != 0, nil56}5758return false, fmt.Errorf(errorMsg, i, i, false)59default:60if i, ok := resolveAlias(i); ok {61return ToBoolE(i)62}6364return false, fmt.Errorf(errorMsg, i, i, false)65}66}6768// ToStringE casts any value to a string type.69func ToStringE(i any) (string, error) {70switch s := i.(type) {71case string:72return s, nil73case bool:74return strconv.FormatBool(s), nil75case float64:76return strconv.FormatFloat(s, 'f', -1, 64), nil77case float32:78return strconv.FormatFloat(float64(s), 'f', -1, 32), nil79case int:80return strconv.Itoa(s), nil81case int8:82return strconv.FormatInt(int64(s), 10), nil83case int16:84return strconv.FormatInt(int64(s), 10), nil85case int32:86return strconv.FormatInt(int64(s), 10), nil87case int64:88return strconv.FormatInt(s, 10), nil89case uint:90return strconv.FormatUint(uint64(s), 10), nil91case uint8:92return strconv.FormatUint(uint64(s), 10), nil93case uint16:94return strconv.FormatUint(uint64(s), 10), nil95case uint32:96return strconv.FormatUint(uint64(s), 10), nil97case uint64:98return strconv.FormatUint(s, 10), nil99case json.Number:100return s.String(), nil101case []byte:102return string(s), nil103case template.HTML:104return string(s), nil105case template.URL:106return string(s), nil107case template.JS:108return string(s), nil109case template.CSS:110return string(s), nil111case template.HTMLAttr:112return string(s), nil113case nil:114return "", nil115case fmt.Stringer:116return s.String(), nil117case error:118return s.Error(), nil119default:120if i, ok := indirect(i); ok {121return ToStringE(i)122}123124if i, ok := resolveAlias(i); ok {125return ToStringE(i)126}127128return "", fmt.Errorf(errorMsg, i, i, "")129}130}131132133