urfave / cli-altsrc

Read values for urfave/cli/v3 flags from config files
https://pkg.go.dev/github.com/urfave/cli-altsrc/v3
MIT License
14 stars 3 forks source link

altsrc requires flag names #2

Open eyudkin opened 4 years ago

eyudkin commented 4 years ago

What problem does this solve?

For now altsrc requires to name my flags using dots to find them into multi-level config files. I.e. to find a flag "level" in the following config:

{
  "infrastructure": {
    "logger": {
      "level": 10
    }
  }
}

..i need to name my flag "infrastructure.logger.level" without exceptions. But what if I don't need it? For my cli interface I want its name to be "--log-level", because I don't need any nested things there. So, I want to be able name flags as I want and configure paths as I want too, separately.

Solution description

Something like:

altsrc.NewIntFlag(&cli.IntFlag{
    Name: "log-level",
    Usage: "Logger level (0 - debug, 1 - info, ...)",
    Value: 1,
}, "my.path.to.flag.in.config"), // added customizable parameter here

Describe alternatives you've considered

Using aliases is not an option there because this ugly long "infrastructure.logger.level" name will be displayed at help screen anyway.

coilysiren commented 4 years ago

Heya! We are planning on completely rewriting altsrc for v3, so its unlikely that a maintainer will get to this issue! I'm marking it as help wanted for any other contributor that wants to help, though 🙏

coilysiren commented 4 years ago

Ah, I just re-read the issue. It looks like this is a feature request? Since altsrc is about to be rewritten, we aren't currently accepting feature requests for it.

stale[bot] commented 4 years ago

This issue or PR has been automatically marked as stale because it has not had recent activity. Please add a comment bumping this if you're still interested in it's resolution! Thanks for your help, please let us know if you need anything else.

stale[bot] commented 4 years ago

Closing this as it has become stale.

abitrolly commented 4 months ago

Looks like it is fixed new, and it is possible to choose any key name in a config file.

configFiles := []string{
    filepath.Join(testdataDir, "config.yaml"),
    filepath.Join(testdataDir, "alt-config.yaml"),
}

app := &cli.Command{
    Name: "greet",
    Flags: []cli.Flag{
        &cli.StringFlag{
            Name:    "name",
            Aliases: []string{"n"},
            Sources: altsrc.YAML("greet.name", configFiles...),
        },
        &cli.IntFlag{
            Name:    "enthusiasm",
            Aliases: []string{"!"},
            Sources: altsrc.YAML("greet.enthusiasm", configFiles...),
        },
    },
    Action: func(cCtx *cli.Context) error {
        punct := ""
        if cCtx.Int("enthusiasm") > 9000 {
            punct = "!"
        }

        fmt.Fprintf(os.Stdout, "Hello, %[1]v%[2]v\n", cCtx.String("name"), punct)

        return nil
    },
}

// Simulating os.Args
os.Args = []string{"greet"}

if err := app.Run(context.Background(), os.Args); err != nil {
    fmt.Fprintf(os.Stdout, "OH NO: %[1]v\n", err)
}