Newer
Older
package cmd
import (
"io"
"os"
"github.com/jessevdk/go-flags"
)
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
}