Matt Low
dce62e7748
Add new SetStructDefaults function to handle the "defaults" struct tag. Only works on struct fields which are pointers (in order to be able to distinguish between not set (nil) and zero values). So, the Config struct has been updated to use pointer fields and we now need to dereference those pointers to use them.
63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/go-yaml/yaml"
|
|
)
|
|
|
|
type Config struct {
|
|
OpenAI *struct {
|
|
APIKey *string `yaml:"apiKey" default:"your_key_here"`
|
|
DefaultModel *string `yaml:"defaultModel" default:"gpt-4"`
|
|
DefaultMaxLength *int `yaml:"defaultMaxLength" default:"256"`
|
|
} `yaml:"openai"`
|
|
}
|
|
|
|
func getConfigDir() string {
|
|
var configDir string
|
|
|
|
xdgConfigHome := os.Getenv("XDG_CONFIG_HOME")
|
|
if xdgConfigHome != "" {
|
|
configDir = filepath.Join(xdgConfigHome, "lmcli")
|
|
} else {
|
|
userHomeDir, _ := os.UserHomeDir()
|
|
configDir = filepath.Join(userHomeDir, ".config/lmcli")
|
|
}
|
|
|
|
os.MkdirAll(configDir, 0755)
|
|
return configDir
|
|
}
|
|
|
|
func NewConfig() (*Config, error) {
|
|
configFile := filepath.Join(getConfigDir(), "config.yaml")
|
|
shouldWriteDefaults := false
|
|
c := &Config{}
|
|
|
|
configBytes, err := os.ReadFile(configFile)
|
|
if os.IsNotExist(err) {
|
|
shouldWriteDefaults = true
|
|
} else if err != nil {
|
|
return nil, fmt.Errorf("Could not read config file: %v", err)
|
|
} else {
|
|
yaml.Unmarshal(configBytes, c)
|
|
}
|
|
|
|
shouldWriteDefaults = SetStructDefaults(c)
|
|
if shouldWriteDefaults {
|
|
file, err := os.Create(configFile)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Could not open config file for writing: %v", err)
|
|
}
|
|
bytes, _ := yaml.Marshal(c)
|
|
_, err = file.Write(bytes)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Could not save default configuration: %v", err)
|
|
}
|
|
}
|
|
|
|
return c, nil
|
|
}
|