From 39f61cd08b99228cce69d562366a7632c4d8cde6 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 1 Dec 2021 18:46:49 +0000 Subject: [PATCH] flagext: add RegisterFlagsWithLogger (#80) * flagext: add RegisterFlagsWithLogger For cases such as `DeprecatedFlag()` that need a logger, extend `RegisterFlags` to allow this while still working with existing code. Signed-off-by: Bryan Boreham --- CHANGELOG.md | 1 + flagext/register.go | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f4d2093e..8776a86d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,5 +20,6 @@ * [ENHANCEMENT] Add runutil.CloseWithLogOnErr function. #58 * [ENHANCEMENT] Optimise memberlist receive path when used as a backing store for rings with a large number of members. #76 #77 #84 * [ENHANCEMENT] Memberlist: prepare the data to send on the write before starting counting the elapsed time for `-memberlist.packet-write-timeout`, in order to reduce chances we hit the timeout when sending a packet to other node. #89 +* [ENHANCEMENT] flagext: for cases such as `DeprecatedFlag()` that need a logger, add RegisterFlagsWithLogger. #80 * [BUGFIX] spanlogger: Support multiple tenant IDs. #59 * [BUGFIX] Memberlist: fixed corrupted packets when sending compound messages with more than 255 messages or messages bigger than 64KB. #85 diff --git a/flagext/register.go b/flagext/register.go index 1140843e0..1004e1ba4 100644 --- a/flagext/register.go +++ b/flagext/register.go @@ -1,12 +1,21 @@ package flagext -import "flag" +import ( + "flag" + + "github.com/go-kit/log" +) // Registerer is a thing that can RegisterFlags type Registerer interface { RegisterFlags(*flag.FlagSet) } +// RegistererWithLogger is a thing that can RegisterFlags with a Logger +type RegistererWithLogger interface { + RegisterFlags(*flag.FlagSet, log.Logger) +} + // RegisterFlags registers flags with the provided Registerers func RegisterFlags(rs ...Registerer) { for _, r := range rs { @@ -14,11 +23,33 @@ func RegisterFlags(rs ...Registerer) { } } +// RegisterFlagsWithLogger registers flags with the provided Registerers +func RegisterFlagsWithLogger(logger log.Logger, rs ...interface{}) { + for _, v := range rs { + switch r := v.(type) { + case Registerer: + r.RegisterFlags(flag.CommandLine) + case RegistererWithLogger: + r.RegisterFlags(flag.CommandLine, logger) + default: + panic("RegisterFlagsWithLogger must be passed a Registerer or RegistererWithLogger") + } + } +} + // DefaultValues initiates a set of configs (Registerers) with their defaults. -func DefaultValues(rs ...Registerer) { +func DefaultValues(rs ...interface{}) { fs := flag.NewFlagSet("", flag.PanicOnError) - for _, r := range rs { - r.RegisterFlags(fs) + logger := log.NewNopLogger() + for _, v := range rs { + switch r := v.(type) { + case Registerer: + r.RegisterFlags(fs) + case RegistererWithLogger: + r.RegisterFlags(fs, logger) + default: + panic("RegisterFlagsWithLogger must be passed a Registerer") + } } _ = fs.Parse([]string{}) }