Skip to content
Snippets Groups Projects
generate-config.go 1.33 KiB
Newer Older
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
}