gci is configured with the sections standard, default and localmodule, and goimports with the module path as its local prefix, so both formatters agree.
92 lines
2.3 KiB
Go
92 lines
2.3 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
|
|
"git.avsdev.uk/Go/job-search/internal/config"
|
|
)
|
|
|
|
func commandInit() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "init [config_path]",
|
|
Args: cobra.MatchAll(cobra.MinimumNArgs(0), cobra.MaximumNArgs(1)),
|
|
Short: "Create an empty configuration file",
|
|
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
|
slog.Debug("config.init.PersistentPreRun")
|
|
},
|
|
PersistentPostRun: func(cmd *cobra.Command, args []string) {
|
|
slog.Debug("config.init.PersistentPostRun")
|
|
},
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
slog.Debug("config.init.Run")
|
|
|
|
if err := cobra.MinimumNArgs(0)(cmd, args); err != nil {
|
|
return err
|
|
}
|
|
if err := cobra.MaximumNArgs(1)(cmd, args); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Flags and arguments are valid from here on, so errors are runtime
|
|
// failures: report them without cobra's usage text.
|
|
cmd.SilenceUsage = true
|
|
|
|
// With no path, the default locations are used.
|
|
cfgFile := ""
|
|
if len(args) > 0 {
|
|
cfgFile = strings.TrimSpace(args[0])
|
|
}
|
|
if cfgFile != "" {
|
|
// Use the config file given.
|
|
viper.SetConfigFile(cfgFile)
|
|
} else {
|
|
// Search config in /etc or local directory.
|
|
viper.AddConfigPath(config.EtcConfigPath)
|
|
viper.AddConfigPath(".")
|
|
viper.SetConfigName("config")
|
|
}
|
|
|
|
err := viper.ReadInConfig()
|
|
if err == nil {
|
|
return errors.New("configuration file already exists")
|
|
}
|
|
|
|
_, ok := err.(viper.ConfigFileNotFoundError)
|
|
if !errors.Is(err, os.ErrNotExist) && !ok {
|
|
// Config file was found but another error was produced
|
|
return err
|
|
}
|
|
|
|
// Load default configuration
|
|
config.LoadDefaultConfig()
|
|
|
|
if viper.ConfigFileUsed() == "" {
|
|
viper.SetConfigFile(config.EtcConfigPath + "/config.yaml")
|
|
}
|
|
|
|
fmt.Print(
|
|
"writing default configuration to file: " +
|
|
viper.ConfigFileUsed() +
|
|
"\n")
|
|
|
|
if err := viper.WriteConfig(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
},
|
|
}
|
|
// Config flag should be hidden as the config path should be provided
|
|
cmd.SetHelpFunc(func(command *cobra.Command, strings []string) {
|
|
command.Flags().MarkHidden("config") //nolint:errcheck,gosec // a root flag, so it always exists
|
|
command.Parent().HelpFunc()(command, strings)
|
|
})
|
|
return cmd
|
|
}
|