package cmd import ( "fmt" "log" "log/slog" "os" "path/filepath" "codeberg.org/Pata1704/system_setup_tool/internal/tui" "github.com/spf13/cobra" "github.com/spf13/viper" ) var RootCmd = &cobra.Command{ Use: "system_setup_tool", Short: "Installs packages based on TOML configuration", Version: "0.6.0", Run: tui.Run, } func init() { cobra.OnInitialize(initConfig) RootCmd.PersistentFlags().StringP("config", "c", "", "Path to the configuration file") err := viper.BindPFlag("config", RootCmd.PersistentFlags().Lookup("config")) if err != nil { slog.Error("could not bind config flag") } addCmd.Flags().StringP("name", "n", "", "The name of the package you want to add") addCmd.Flags().StringP("manager", "m", "", "The package manager you want to add the package to (homebrew|cargo|flatpak|pipx|go)") addCmd.Flags().Bool("system", false, "Add as a system package") addCmd.Flags().Bool("headless", false, "Add as a headless system package (only used with --system)") deleteCmd.Flags().StringP("name", "n", "", "The name of the package you want to delete") deleteCmd.Flags().StringP("manager", "m", "", "The package manager you want to delete the package from (homebrew|cargo|flatpak|pipx|go)") deleteCmd.Flags().Bool("system", false, "Delete from system packages") deleteCmd.Flags().Bool("headless", false, "Delete from headless system packages (only used with --system)") enableCmd.Flags().Bool("value", true, "Set to true to enable, false to disable") installCmd.Flags().StringP("manager", "m", "os", "The package manager you want to install a package with. (Options: os|homebrew|pipx|flatpak|cargo)") removeCmd.Flags().StringP("manager", "m", "os", "The package manager you want to remove a package with. (Options: os|homebrew|pipx|flatpak|cargo)") searchCmd.Flags().StringP("manager", "m", "", "The package manager you want to search a package with. (Options: os|homebrew|flatpak)") updateCmd.Flags().StringP("manager", "m", "os", "The package manager you want to update packages with. (Options: os|homebrew|pipx|flatpak)") checkCmd.Flags().StringP("manager", "m", "os", "The package manager you want to check for a packages with. (Options: os|homebrew|pipx|flatpak)") packageCmd.AddCommand( addCmd, deleteCmd, showCmd, enableCmd, ) RootCmd.AddCommand( packageCmd, searchCmd, installCmd, removeCmd, updateCmd, updateAllCmd, historyCmd, checkCmd, ) } func initConfig() { if cfgFile := viper.GetString("config"); cfgFile != "" { viper.SetConfigFile(cfgFile) } else { viper.SetConfigName("config") viper.SetConfigType("toml") dirname, err := os.UserConfigDir() if err != nil { log.Println("cant obtain config dir") } else { viper.AddConfigPath(filepath.Join(dirname, "sst")) } } if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { fmt.Println("no config file found, creating a new one...") if err = createDefaultConfig(); err != nil { slog.Error(fmt.Sprintf("error creating default config: %v\n", err)) os.Exit(1) } } else { log.Printf("error reading config file: %v\n", err) os.Exit(1) } } } func createDefaultConfig() error { v := viper.New() v.SetDefault("config", "") v.SetDefault("headless", true) v.SetDefault("dotfiles.enable", false) v.SetDefault("dotfiles.git_repo", "") v.SetDefault("package_managers.cargo.enable", false) v.SetDefault("package_managers.cargo.packages", []string{}) v.SetDefault("package_managers.flatpak.enable", false) v.SetDefault("package_managers.flatpak.packages", []string{}) v.SetDefault("package_managers.go.enable", false) v.SetDefault("package_managers.go.packages", []string{}) v.SetDefault("package_managers.homebrew.enable", false) v.SetDefault("package_managers.homebrew.packages", []string{}) v.SetDefault("package_managers.pipx.enable", false) v.SetDefault("package_managers.pipx.packages", []string{}) v.SetDefault("package_managers.os.enable", true) v.SetDefault("package_managers.os.packages", []string{}) configDir := filepath.Join(os.Getenv("HOME"), ".config", "sst") if err := os.MkdirAll(configDir, 0o755); err != nil { return fmt.Errorf("error creating config dir: %w", err) } configPath := filepath.Join(configDir, "config.toml") v.SetConfigFile(configPath) v.SetConfigType("toml") if err := v.WriteConfig(); err != nil { return fmt.Errorf("error writing default config: %w", err) } fmt.Println("default config created:", configPath) return nil }