in struct_field.go [70:104]
func getStructFieldFlag(field reflect.StructField, fieldValue reflect.Value, ns []string) []cli.Flag {
var names []string
if name := field.Tag.Get("short"); name != "" {
names = append(names, strings.Join(append(ns, name), "-"))
}
if name := field.Tag.Get("long"); name != "" {
names = append(names, strings.Join(append(ns, name), "-"))
}
if len(names) == 0 {
return []cli.Flag{}
}
envName := field.Tag.Get("env")
// If the env tag begins with "@", any namespace tags take affect, with an opininated format:
// - All characters are uppercased
// - All hyphens are converted to underscores
if strings.HasPrefix(envName, "@") {
envName = strings.Join(append(ns, envName[1:]), "_")
envName = strings.ToUpper(envName)
envName = strings.ReplaceAll(envName, "-", "_")
}
flag := cli.GenericFlag{
Name: strings.Join(names, ", "),
Value: StructFieldValue{
field: field,
value: fieldValue,
},
Usage: reName.ReplaceAllString(field.Tag.Get("description"), "`$1`"),
EnvVar: envName,
}
return []cli.Flag{StructFieldFlag{GenericFlag: flag}}
}