2024-03-27 02:11:46 -06:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2024-03-28 15:45:20 -06:00
|
|
|
"context"
|
|
|
|
"reflect"
|
|
|
|
"strings"
|
|
|
|
"strconv"
|
2024-03-27 03:26:20 -06:00
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2024-03-28 15:45:20 -06:00
|
|
|
"git.pixelridgesoftworks.com/BackGo/config"
|
2024-03-27 02:11:46 -06:00
|
|
|
)
|
|
|
|
|
2024-03-27 03:26:20 -06:00
|
|
|
func OpenConfigInNano() error {
|
2024-03-28 15:45:20 -06:00
|
|
|
configFilePath := config.GetConfigFilePath()
|
|
|
|
cmd := exec.Command("nano", configFilePath)
|
|
|
|
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("error opening config in nano: %v", err)
|
|
|
|
}
|
|
|
|
return nil
|
2024-03-27 02:11:46 -06:00
|
|
|
}
|
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
func EditConfigOption(ctx context.Context, optionName, newValue string) error {
|
2024-03-27 03:26:20 -06:00
|
|
|
cfg, err := config.LoadConfigFromFile()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("loading config: %v", err)
|
|
|
|
}
|
2024-03-27 02:11:46 -06:00
|
|
|
|
2024-03-28 15:45:20 -06:00
|
|
|
if err := setConfigOption(cfg, optionName, newValue); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := config.SaveConfigToFile(cfg); err != nil {
|
|
|
|
return fmt.Errorf("saving config: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func setConfigOption(cfg *config.Config, optionName, newValue string) error {
|
2024-03-27 03:26:20 -06:00
|
|
|
rConfig := reflect.ValueOf(cfg).Elem()
|
|
|
|
field := rConfig.FieldByNameFunc(func(s string) bool {
|
|
|
|
return strings.EqualFold(s, optionName)
|
|
|
|
})
|
2024-03-27 02:11:46 -06:00
|
|
|
|
2024-03-27 03:26:20 -06:00
|
|
|
if !field.IsValid() {
|
|
|
|
return fmt.Errorf("unknown configuration option: %s", optionName)
|
|
|
|
}
|
2024-03-27 02:11:46 -06:00
|
|
|
|
2024-03-27 03:26:20 -06:00
|
|
|
if !field.CanSet() {
|
|
|
|
return fmt.Errorf("cannot set configuration option: %s", optionName)
|
|
|
|
}
|
|
|
|
|
|
|
|
switch field.Kind() {
|
|
|
|
case reflect.String:
|
|
|
|
field.SetString(newValue)
|
|
|
|
case reflect.Bool:
|
|
|
|
boolVal, err := strconv.ParseBool(newValue)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("invalid value for %s: %v", optionName, err)
|
|
|
|
}
|
|
|
|
field.SetBool(boolVal)
|
2024-03-28 15:45:20 -06:00
|
|
|
case reflect.Int, reflect.Int64:
|
|
|
|
intVal, err := strconv.ParseInt(newValue, 10, 64)
|
2024-03-27 03:26:20 -06:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("invalid value for %s: %v", optionName, err)
|
|
|
|
}
|
2024-03-28 15:45:20 -06:00
|
|
|
field.SetInt(intVal)
|
2024-03-27 03:26:20 -06:00
|
|
|
default:
|
|
|
|
return fmt.Errorf("unsupported configuration type for: %s", optionName)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2024-03-27 02:11:46 -06:00
|
|
|
}
|