Checklist
What problem does this solve?
The standard library's flag package has had flag.TextVar since 1.19 which allows any type that satisfies encoding.TextMarshaller and encoding.TextUnmarshaller to be set using flags. A good use for this is to set log level using strings such as slog.LevelVar.
Other logging packages such as go.uber.org/zap satisfies these interfaces for its atomic level type. You can have a logger before the log level has been set. It'll be ready before arguments have been parsed and output structured logs in case of a parse error.
Solution description
Implement TextValue and TextFlag.
Describe alternatives you've considered
Here's what I had to implement to get the functionality. It would be nice to see this being supported by this package.
package clix
import (
"encoding"
"strings"
"github.com/urfave/cli/v3"
)
type TextMarshalUnMarshaller interface {
encoding.TextMarshaler
encoding.TextUnmarshaler
}
type TextFlag = cli.FlagBase[TextMarshalUnMarshaller, cli.StringConfig, TextValue]
type TextValue struct {
Value TextMarshalUnMarshaller
Config cli.StringConfig
}
func (v TextValue) String() string {
text, err := v.Value.MarshalText()
if err != nil {
return ""
}
return string(text)
}
func (v TextValue) Set(s string) error {
if v.Config.TrimSpace {
return v.Value.UnmarshalText([]byte(strings.TrimSpace(s)))
}
return v.Value.UnmarshalText([]byte(s))
}
func (v TextValue) Get() any {
return v.Value
}
func (v TextValue) Create(t TextMarshalUnMarshaller, _ *TextMarshalUnMarshaller, c cli.StringConfig) cli.Value {
return &TextValue{
Value: t,
Config: c,
}
}
func (v TextValue) ToString(t TextMarshalUnMarshaller) string {
text, err := t.MarshalText()
if err != nil {
return ""
}
return string(text)
}
I can contribute a solution based on this if so desired.
Checklist
What problem does this solve?
The standard library's
flagpackage has hadflag.TextVarsince 1.19 which allows any type that satisfiesencoding.TextMarshallerandencoding.TextUnmarshallerto be set using flags. A good use for this is to set log level using strings such asslog.LevelVar.Other logging packages such as
go.uber.org/zapsatisfies these interfaces for its atomic level type. You can have a logger before the log level has been set. It'll be ready before arguments have been parsed and output structured logs in case of a parse error.Solution description
Implement
TextValueandTextFlag.Describe alternatives you've considered
Here's what I had to implement to get the functionality. It would be nice to see this being supported by this package.
I can contribute a solution based on this if so desired.