blob: c085b5216f3b366af92698a15bfa06a6435ce493 [file] [log] [blame]
Tim Windelschmidtb6308cd2023-10-10 21:19:03 +02001// Package mflags implements custom flags for use in monogon projects.
2// It provides them to be used like normal flag.$Var and registers the
3// required flag functions.
4package mflags
5
6import (
7 "flag"
8 "fmt"
9 "strconv"
10 "strings"
11 "time"
12
13 "golang.org/x/time/rate"
14)
15
16// Limiter configures a *rate.Limiter as a flag.
17func Limiter(l **rate.Limiter, name, defval, help string) {
18 syntax := "'duration,count' eg. '2m,10' for a 10-sized bucket refilled at one token every 2 minutes"
19 help = help + fmt.Sprintf(" (default: %q, syntax: %s)", defval, syntax)
20 flag.Func(name, help, func(val string) error {
21 if val == "" {
22 val = defval
23 }
24 parts := strings.Split(val, ",")
25 if len(parts) != 2 {
26 return fmt.Errorf("invalid syntax, want: %s", syntax)
27 }
28 duration, err := time.ParseDuration(parts[0])
29 if err != nil {
30 return fmt.Errorf("invalid duration: %w", err)
31 }
32 refill, err := strconv.ParseUint(parts[1], 10, 31)
33 if err != nil {
34 return fmt.Errorf("invalid refill rate: %w", err)
35 }
36 *l = rate.NewLimiter(rate.Every(duration), int(refill))
37 return nil
38 })
39 flag.Set(name, defval)
40}