package cmd import ( "io" "os" "github.com/jessevdk/go-flags" ) //nolint:lll type GenerateConfigCmd struct { Output string `short:"o" long:"config-output" no-ini:"t" description:"Destination of the generated configuration" default:"-"` parser *flags.Parser } func (cmd *GenerateConfigCmd) Execute([]string) error { var output io.Writer var finalize func() error if cmd.Output == "-" { output = os.Stdout } else { f, err := os.CreateTemp("", "ioda-config.*.ini") if err != nil { return err } var finalized bool defer func() { if !finalized { os.Remove(f.Name()) } }() finalize = func() error { if err := os.Rename(f.Name(), cmd.Output); err != nil { _ = os.Remove(f.Name()) return err } finalized = true return nil } output = f } fp := flags.NewIniParser(cmd.parser) fp.Write(output, flags.IniIncludeDefaults|flags.IniCommentDefaults|flags.IniDefault) if _, err := output.Write([]byte{}); err != nil { return err } if finalize != nil { return finalize() } return nil } func SetupGenerateConfigCmd[E any](program *Program[E]) *GenerateConfigCmd { cmd := GenerateConfigCmd{ parser: program.Parser, } _, err := program.Parser.AddCommand("generate-config", "Generate config", "", &cmd) if err != nil { program.Logger.Fatal().Msg(err.Error()) } return &cmd }