|
| 1 | +// Patchwork - automated patch tracking system |
| 2 | +// Copyright (C) The Patchwork Contributors (see CONTRIBUTORS) |
| 3 | +// |
| 4 | +// SPDX-License-Identifier: GPL-2.0-or-later |
| 5 | + |
| 6 | +package config |
| 7 | + |
| 8 | +import ( |
| 9 | + "fmt" |
| 10 | + "regexp" |
| 11 | + "strconv" |
| 12 | + "time" |
| 13 | +) |
| 14 | + |
| 15 | +type Duration time.Duration |
| 16 | + |
| 17 | +var durationRe = regexp.MustCompile(`^(\d+)(w|d|h|m|s|ms|us|ns)$`) |
| 18 | + |
| 19 | +func ParseDuration(s string) (Duration, error) { |
| 20 | + m := durationRe.FindStringSubmatch(s) |
| 21 | + if m != nil { |
| 22 | + n, err := strconv.ParseInt(m[1], 10, 64) |
| 23 | + if err != nil { |
| 24 | + return 0, err |
| 25 | + } |
| 26 | + switch m[2] { |
| 27 | + case "w": |
| 28 | + return Duration(time.Duration(n) * 7 * 24 * time.Hour), nil |
| 29 | + case "d": |
| 30 | + return Duration(time.Duration(n) * 24 * time.Hour), nil |
| 31 | + } |
| 32 | + } |
| 33 | + d, err := time.ParseDuration(s) |
| 34 | + if err != nil { |
| 35 | + return 0, fmt.Errorf("invalid duration %q", s) |
| 36 | + } |
| 37 | + return Duration(d), nil |
| 38 | +} |
| 39 | + |
| 40 | +func (d Duration) Duration() time.Duration { |
| 41 | + return time.Duration(d) |
| 42 | +} |
| 43 | + |
| 44 | +func (d Duration) String() string { |
| 45 | + td := time.Duration(d) |
| 46 | + if td == 0 { |
| 47 | + return "0s" |
| 48 | + } |
| 49 | + week := 7 * 24 * time.Hour |
| 50 | + day := 24 * time.Hour |
| 51 | + if td%week == 0 { |
| 52 | + return fmt.Sprintf("%dw", td/week) |
| 53 | + } |
| 54 | + if td%day == 0 { |
| 55 | + return fmt.Sprintf("%dd", td/day) |
| 56 | + } |
| 57 | + return td.String() |
| 58 | +} |
| 59 | + |
| 60 | +func (d *Duration) UnmarshalText(b []byte) error { |
| 61 | + v, err := ParseDuration(string(b)) |
| 62 | + if err != nil { |
| 63 | + return err |
| 64 | + } |
| 65 | + *d = v |
| 66 | + return nil |
| 67 | +} |
0 commit comments