Open
Description
Checklist
- Are you running the latest v3 release? The list of releases is here.Did you check the manual for your release? The v3 manual is here.Did you perform a search about this feature? Here's the GitHub guide about searching.
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.
Activity
dearchap commentedon Feb 5, 2025
@somebadcode Yes please !!!!
feat: add TextFlag
feat: add TextFlag
dearchap commentedon Apr 19, 2025
@somebadcode This is what I have and it works
Only difference is that it uses the GenericFlag instead of a new TextFlag. While I like the TextFlag approach I think the current plumbing of cli allows you to achieve what you want without a new flag in the mix.
feat: add TextFlag