From 9e6db178b09387e21ac19ce85369cf1ca7a443e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Tue, 27 Mar 2018 10:23:33 +0200 Subject: Adding durafmt library and use it from enterprise global relay export (#8487) * Adding durafmt library and use it from enterprise global relay export * Allow to specify different server host and server name on smtp connections * Fixing utils/smtp tests --- vendor/github.com/hako/durafmt/durafmt.go | 120 ++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 vendor/github.com/hako/durafmt/durafmt.go (limited to 'vendor/github.com/hako/durafmt/durafmt.go') diff --git a/vendor/github.com/hako/durafmt/durafmt.go b/vendor/github.com/hako/durafmt/durafmt.go new file mode 100644 index 000000000..a7e0a48c2 --- /dev/null +++ b/vendor/github.com/hako/durafmt/durafmt.go @@ -0,0 +1,120 @@ +// Package durafmt formats time.Duration into a human readable format. +package durafmt + +import ( + "errors" + "strconv" + "strings" + "time" +) + +var ( + units = []string{"years", "weeks", "days", "hours", "minutes", "seconds", "milliseconds"} +) + +// Durafmt holds the parsed duration and the original input duration. +type Durafmt struct { + duration time.Duration + input string // Used as reference. +} + +// Parse creates a new *Durafmt struct, returns error if input is invalid. +func Parse(dinput time.Duration) *Durafmt { + input := dinput.String() + return &Durafmt{dinput, input} +} + +// ParseString creates a new *Durafmt struct from a string. +// returns an error if input is invalid. +func ParseString(input string) (*Durafmt, error) { + if input == "0" || input == "-0" { + return nil, errors.New("durafmt: missing unit in duration " + input) + } + duration, err := time.ParseDuration(input) + if err != nil { + return nil, err + } + return &Durafmt{duration, input}, nil +} + +// String parses d *Durafmt into a human readable duration. +func (d *Durafmt) String() string { + var duration string + + // Check for minus durations. + if string(d.input[0]) == "-" { + duration += "-" + d.duration = -d.duration + } + + // Convert duration. + seconds := int64(d.duration.Seconds()) % 60 + minutes := int64(d.duration.Minutes()) % 60 + hours := int64(d.duration.Hours()) % 24 + days := int64(d.duration/(24*time.Hour)) % 365 % 7 + + // Edge case between 364 and 365 days. + // We need to calculate weeks from what is left from years + leftYearDays := int64(d.duration/(24*time.Hour)) % 365 + weeks := leftYearDays / 7 + if leftYearDays >= 364 && leftYearDays < 365 { + weeks = 52 + } + + years := int64(d.duration/(24*time.Hour)) / 365 + milliseconds := int64(d.duration/time.Millisecond) - + (seconds * 1000) - (minutes * 60000) - (hours * 3600000) - + (days * 86400000) - (weeks * 604800000) - (years * 31536000000) + + // Create a map of the converted duration time. + durationMap := map[string]int64{ + "milliseconds": milliseconds, + "seconds": seconds, + "minutes": minutes, + "hours": hours, + "days": days, + "weeks": weeks, + "years": years, + } + + // Construct duration string. + for _, u := range units { + v := durationMap[u] + strval := strconv.FormatInt(v, 10) + switch { + // add to the duration string if v > 1. + case v > 1: + duration += strval + " " + u + " " + // remove the plural 's', if v is 1. + case v == 1: + duration += strval + " " + strings.TrimRight(u, "s") + " " + // omit any value with 0s or 0. + case d.duration.String() == "0" || d.duration.String() == "0s": + // note: milliseconds and minutes have the same suffix (m) + // so we have to check if the units match with the suffix. + + // check for a suffix that is NOT the milliseconds suffix. + if strings.HasSuffix(d.input, string(u[0])) && !strings.Contains(d.input, "ms") { + // if it happens that the units are milliseconds, skip. + if u == "milliseconds" { + continue + } + duration += strval + " " + u + } + // process milliseconds here. + if u == "milliseconds" { + if strings.Contains(d.input, "ms") { + duration += strval + " " + u + break + } + } + break + // omit any value with 0. + case v == 0: + continue + } + } + // trim any remaining spaces. + duration = strings.TrimSpace(duration) + return duration +} -- cgit v1.2.3-1-g7c22