github.com/go-spring/spring-base@v1.1.3/cast/duration.go (about) 1 /* 2 * Copyright 2012-2019 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package cast 18 19 import ( 20 "fmt" 21 "time" 22 ) 23 24 // ToDuration casts an interface{} to a time.Duration. 25 // When type is clear, it is recommended to use standard library functions. 26 func ToDuration(i interface{}, unit ...time.Duration) time.Duration { 27 v, _ := ToDurationE(i, unit...) 28 return v 29 } 30 31 // ToDurationE casts an interface{} to a time.Duration. 32 // When type is clear, it is recommended to use standard library functions. 33 func ToDurationE(i interface{}, unit ...time.Duration) (time.Duration, error) { 34 base := int64(time.Nanosecond) 35 if len(unit) > 0 { 36 base = int64(unit[0]) 37 } 38 switch s := i.(type) { 39 case nil: 40 return 0, nil 41 case int: 42 return time.Duration(int64(s) * base), nil 43 case int8: 44 return time.Duration(int64(s) * base), nil 45 case int16: 46 return time.Duration(int64(s) * base), nil 47 case int32: 48 return time.Duration(int64(s) * base), nil 49 case int64: 50 return time.Duration(int64(s) * base), nil 51 case *int: 52 return time.Duration(int64(*s) * base), nil 53 case *int8: 54 return time.Duration(int64(*s) * base), nil 55 case *int16: 56 return time.Duration(int64(*s) * base), nil 57 case *int32: 58 return time.Duration(int64(*s) * base), nil 59 case *int64: 60 return time.Duration(int64(*s) * base), nil 61 case uint: 62 return time.Duration(int64(s) * base), nil 63 case uint8: 64 return time.Duration(int64(s) * base), nil 65 case uint16: 66 return time.Duration(int64(s) * base), nil 67 case uint32: 68 return time.Duration(int64(s) * base), nil 69 case uint64: 70 return time.Duration(int64(s) * base), nil 71 case *uint: 72 return time.Duration(int64(*s) * base), nil 73 case *uint8: 74 return time.Duration(int64(*s) * base), nil 75 case *uint16: 76 return time.Duration(int64(*s) * base), nil 77 case *uint32: 78 return time.Duration(int64(*s) * base), nil 79 case *uint64: 80 return time.Duration(int64(*s) * base), nil 81 case float32: 82 return time.Duration(float64(s) * float64(base)), nil 83 case float64: 84 return time.Duration(s * float64(base)), nil 85 case *float32: 86 return time.Duration(float64(*s) * float64(base)), nil 87 case *float64: 88 return time.Duration((*s) * float64(base)), nil 89 case string: 90 return time.ParseDuration(s) 91 case *string: 92 return time.ParseDuration(*s) 93 case time.Duration: 94 return s, nil 95 default: 96 return 0, fmt.Errorf("unable to cast type (%T) to time.Duration", i) 97 } 98 }