127 lines
2.4 KiB
Go
127 lines
2.4 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
const (
|
|
DefaultBaseURL = "https://www.gitlink.org.cn/api"
|
|
DefaultGatewayURL = "https://gateway.gitlink.org.cn/api"
|
|
DefaultFormat = "table"
|
|
)
|
|
|
|
type Config struct {
|
|
BaseURL string `yaml:"base_url"`
|
|
GatewayURL string `yaml:"gateway_url"`
|
|
Format string `yaml:"default_format"`
|
|
Editor string `yaml:"editor,omitempty"`
|
|
Pager string `yaml:"pager,omitempty"`
|
|
Lang string `yaml:"lang,omitempty"`
|
|
// Aliases maps a user-defined shortcut name to the command line it expands to.
|
|
Aliases map[string]string `yaml:"aliases,omitempty"`
|
|
}
|
|
|
|
func DefaultConfig() *Config {
|
|
return &Config{
|
|
BaseURL: DefaultBaseURL,
|
|
GatewayURL: DefaultGatewayURL,
|
|
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.GatewayURL == "" {
|
|
cfg.GatewayURL = DefaultGatewayURL
|
|
}
|
|
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 "gateway_url":
|
|
return cfg.GatewayURL, 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 "gateway_url":
|
|
cfg.GatewayURL = 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)
|
|
}
|