gitlink-cli/internal/config/config.go

115 lines
2.0 KiB
Go

package config
import (
"os"
"path/filepath"
"gopkg.in/yaml.v3"
)
const (
DefaultBaseURL = "https://www.gitlink.org.cn/api"
DefaultFormat = "table"
)
type Config struct {
BaseURL string `yaml:"base_url"`
Format string `yaml:"default_format"`
Editor string `yaml:"editor,omitempty"`
Pager string `yaml:"pager,omitempty"`
Lang string `yaml:"lang,omitempty"`
}
func DefaultConfig() *Config {
return &Config{
BaseURL: DefaultBaseURL,
Format: DefaultFormat,
}
}
func ConfigDir() string {
if dir := os.Getenv("GITLINK_CONFIG_DIR"); dir != "" {
return dir
}
home, _ := os.UserHomeDir()
return filepath.Join(home, ".config", "gitlink-cli")
}
func ConfigPath() string {
return filepath.Join(ConfigDir(), "config.yaml")
}
func Load() (*Config, error) {
cfg := DefaultConfig()
data, err := os.ReadFile(ConfigPath())
if err != nil {
if os.IsNotExist(err) {
return cfg, nil
}
return nil, err
}
if err := yaml.Unmarshal(data, cfg); err != nil {
return nil, err
}
if cfg.BaseURL == "" {
cfg.BaseURL = DefaultBaseURL
}
if cfg.Format == "" {
cfg.Format = DefaultFormat
}
return cfg, nil
}
func Save(cfg *Config) error {
dir := ConfigDir()
if err := os.MkdirAll(dir, 0700); err != nil {
return err
}
data, err := yaml.Marshal(cfg)
if err != nil {
return err
}
return os.WriteFile(ConfigPath(), data, 0600)
}
func Get(key string) (string, error) {
cfg, err := Load()
if err != nil {
return "", err
}
switch key {
case "base_url":
return cfg.BaseURL, nil
case "default_format":
return cfg.Format, nil
case "editor":
return cfg.Editor, nil
case "pager":
return cfg.Pager, nil
case "lang":
return cfg.Lang, nil
default:
return "", nil
}
}
func Set(key, value string) error {
cfg, err := Load()
if err != nil {
return err
}
switch key {
case "base_url":
cfg.BaseURL = value
case "default_format":
cfg.Format = value
case "editor":
cfg.Editor = value
case "pager":
cfg.Pager = value
case "lang":
cfg.Lang = value
}
return Save(cfg)
}