Generate config flags (#4268)

Fix #4262
This commit is contained in:
cnderrauber authored and GitHub committed 2026-01-29 15:04:01 +08:00
1 parent 700e1788f2
commit 76a41a7a8c
2 files changed
+76 -35

No files matched your search

+5 -1
View File
@@ -92,7 +92,11 @@ func helpVerbose(_ context.Context, c *cli.Command) error {
return err
}
c.Flags = append(baseFlags, generatedFlags...)
flags := append([]cli.Flag{}, baseFlags...)
flags = append(flags, generatedFlags...)
root := c.Root()
root.Flags = flags
c.Flags = flags
return cli.ShowAppHelp(c)
}
+71 -34
View File
@@ -18,6 +18,7 @@ import (
"fmt"
"os"
"reflect"
"strconv"
"strings"
"time"
@@ -618,9 +619,9 @@ func (conf *Config) ValidateKeys() error {
}
func GenerateCLIFlags(existingFlags []cli.Flag, hidden bool) ([]cli.Flag, error) {
blankConfig := &Config{}
defaultConfig := &DefaultConfig
flags := make([]cli.Flag, 0)
for name, value := range blankConfig.ToCLIFlagNames(existingFlags) {
for name, value := range (defaultConfig).ToCLIFlagNames(existingFlags) {
kind := value.Kind()
if kind == reflect.Ptr {
kind = value.Type().Elem().Kind()
@@ -628,63 +629,72 @@ func GenerateCLIFlags(existingFlags []cli.Flag, hidden bool) ([]cli.Flag, error)
var flag cli.Flag
envVar := fmt.Sprintf("LIVEKIT_%s", strings.ToUpper(strings.Replace(name, ".", "_", -1)))
defaultText := cliDefaultText(value)
switch kind {
case reflect.Bool:
flag = &cli.BoolFlag{
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
Hidden: hidden,
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
DefaultText: defaultText,
Hidden: hidden,
}
case reflect.String:
flag = &cli.StringFlag{
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
Hidden: hidden,
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
DefaultText: defaultText,
Hidden: hidden,
}
case reflect.Int, reflect.Int32:
flag = &cli.IntFlag{
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
Hidden: hidden,
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
DefaultText: defaultText,
Hidden: hidden,
}
case reflect.Int64:
flag = &cli.Int64Flag{
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
Hidden: hidden,
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
DefaultText: defaultText,
Hidden: hidden,
}
case reflect.Uint8, reflect.Uint16, reflect.Uint32:
flag = &cli.UintFlag{
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
Hidden: hidden,
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
DefaultText: defaultText,
Hidden: hidden,
}
case reflect.Uint64:
flag = &cli.Uint64Flag{
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
Hidden: hidden,
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
DefaultText: defaultText,
Hidden: hidden,
}
case reflect.Float32:
flag = &cli.Float64Flag{
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
Hidden: hidden,
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
DefaultText: defaultText,
Hidden: hidden,
}
case reflect.Float64:
flag = &cli.Float64Flag{
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
Hidden: hidden,
Name: name,
Sources: cli.EnvVars(envVar),
Usage: generatedCLIFlagUsage,
DefaultText: defaultText,
Hidden: hidden,
}
case reflect.Slice:
// TODO
@@ -705,6 +715,33 @@ func GenerateCLIFlags(existingFlags []cli.Flag, hidden bool) ([]cli.Flag, error)
return flags, nil
}
func cliDefaultText(value reflect.Value) string {
if value.Kind() == reflect.Ptr {
if value.IsNil() {
return ""
}
value = value.Elem()
}
switch value.Kind() {
case reflect.Bool:
return strconv.FormatBool(value.Bool())
case reflect.String:
return value.String()
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
if value.Type() == reflect.TypeOf(time.Duration(0)) {
return value.Interface().(time.Duration).String()
}
return strconv.FormatInt(value.Int(), 10)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return strconv.FormatUint(value.Uint(), 10)
case reflect.Float32, reflect.Float64:
return strconv.FormatFloat(value.Float(), 'f', -1, 64)
default:
return ""
}
}
func (conf *Config) updateFromCLI(c *cli.Command, baseFlags []cli.Flag) error {
generatedFlagNames := conf.ToCLIFlagNames(baseFlags)
for _, flag := range c.Flags {