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