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  }