github.com/influxdata/telegraf@v1.30.3/config/types.go (about)

     1  package config
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  	"strconv"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/alecthomas/units"
    11  )
    12  
    13  // Regexp for day specifications in durations
    14  var durationDayRe = regexp.MustCompile(`(\d+(?:\.\d+)?)d`)
    15  
    16  // Duration is a time.Duration
    17  type Duration time.Duration
    18  
    19  // Size is an int64
    20  type Size int64
    21  
    22  // UnmarshalTOML parses the duration from the TOML config file
    23  func (d *Duration) UnmarshalText(b []byte) error {
    24  	// convert to string
    25  	durStr := string(b)
    26  
    27  	// Value is a TOML number (e.g. 3, 10, 3.5)
    28  	// First try parsing as integer seconds
    29  	sI, err := strconv.ParseInt(durStr, 10, 64)
    30  	if err == nil {
    31  		dur := time.Second * time.Duration(sI)
    32  		*d = Duration(dur)
    33  		return nil
    34  	}
    35  	// Second try parsing as float seconds
    36  	sF, err := strconv.ParseFloat(durStr, 64)
    37  	if err == nil {
    38  		dur := float64(time.Second) * sF
    39  		*d = Duration(dur)
    40  		return nil
    41  	}
    42  
    43  	// Finally, try value is a TOML string (e.g. "3s", 3s) or literal (e.g. '3s')
    44  	if durStr == "" {
    45  		*d = Duration(0)
    46  		return nil
    47  	}
    48  
    49  	// Handle "day" intervals and replace them with the "hours" equivalent
    50  	for _, m := range durationDayRe.FindAllStringSubmatch(durStr, -1) {
    51  		days, err := strconv.ParseFloat(m[1], 64)
    52  		if err != nil {
    53  			return fmt.Errorf("converting %q to hours failed: %w", durStr, err)
    54  		}
    55  		hours := strconv.FormatFloat(days*24, 'f', -1, 64) + "h"
    56  		durStr = strings.Replace(durStr, m[0], hours, 1)
    57  	}
    58  
    59  	dur, err := time.ParseDuration(durStr)
    60  	if err != nil {
    61  		return err
    62  	}
    63  
    64  	*d = Duration(dur)
    65  	return nil
    66  }
    67  
    68  func (s *Size) UnmarshalText(b []byte) error {
    69  	if len(b) == 0 {
    70  		return nil
    71  	}
    72  
    73  	str := string(b)
    74  	val, err := strconv.ParseInt(str, 10, 64)
    75  	if err == nil {
    76  		*s = Size(val)
    77  		return nil
    78  	}
    79  	val, err = units.ParseStrictBytes(str)
    80  	if err != nil {
    81  		return err
    82  	}
    83  	*s = Size(val)
    84  	return nil
    85  }