/* Copyright © 2026 Craig Williams This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ package config import ( "errors" "fmt" "log/slog" "os" "git.avsdev.uk/Go/job-search/internal/config" "github.com/spf13/cobra" "github.com/spf13/viper" ) 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 } cfgFile, _ := cmd.Flags().GetString("config") if cfgFile != "" { // Use config file from the flag. 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 }, } return cmd }