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 }