110 lines
2.2 KiB
Go
110 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
configDirName = ".htsy"
|
|
configFileName = "config.json"
|
|
defaultBaseURL = "https://htsy-gateway.cpshelp.cn"
|
|
)
|
|
|
|
type Config struct {
|
|
BaseURL string `json:"baseUrl,omitempty"`
|
|
Token string `json:"token,omitempty"`
|
|
Username string `json:"username,omitempty"`
|
|
LoginKind string `json:"loginKind,omitempty"`
|
|
UpdatedAt time.Time `json:"updatedAt,omitempty"`
|
|
}
|
|
|
|
func defaultConfigPath() (string, error) {
|
|
if value := os.Getenv("HTSY_CONFIG"); value != "" {
|
|
return value, nil
|
|
}
|
|
|
|
home, err := os.UserHomeDir()
|
|
if err != nil {
|
|
return "", fmt.Errorf("resolve home directory: %w", err)
|
|
}
|
|
|
|
return filepath.Join(home, configDirName, configFileName), nil
|
|
}
|
|
|
|
func resolveConfigPath(path string) (string, error) {
|
|
if path != "" {
|
|
return path, nil
|
|
}
|
|
return defaultConfigPath()
|
|
}
|
|
|
|
func loadConfig(path string) (Config, error) {
|
|
resolved, err := resolveConfigPath(path)
|
|
if err != nil {
|
|
return Config{}, err
|
|
}
|
|
|
|
data, err := os.ReadFile(resolved)
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
return Config{BaseURL: defaultBaseURL}, nil
|
|
}
|
|
if err != nil {
|
|
return Config{}, fmt.Errorf("read config %s: %w", resolved, err)
|
|
}
|
|
|
|
var cfg Config
|
|
if err := json.Unmarshal(data, &cfg); err != nil {
|
|
return Config{}, fmt.Errorf("parse config %s: %w", resolved, err)
|
|
}
|
|
if cfg.BaseURL == "" {
|
|
cfg.BaseURL = defaultBaseURL
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|
|
|
|
func saveConfig(path string, cfg Config) error {
|
|
resolved, err := resolveConfigPath(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if cfg.BaseURL == "" {
|
|
cfg.BaseURL = defaultBaseURL
|
|
}
|
|
cfg.UpdatedAt = time.Now().UTC()
|
|
|
|
dir := filepath.Dir(resolved)
|
|
if err := os.MkdirAll(dir, 0o700); err != nil {
|
|
return fmt.Errorf("create config dir %s: %w", dir, err)
|
|
}
|
|
|
|
data, err := json.MarshalIndent(cfg, "", " ")
|
|
if err != nil {
|
|
return fmt.Errorf("encode config: %w", err)
|
|
}
|
|
data = append(data, '\n')
|
|
|
|
if err := os.WriteFile(resolved, data, 0o600); err != nil {
|
|
return fmt.Errorf("write config %s: %w", resolved, err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func clearLogin(path string) error {
|
|
cfg, err := loadConfig(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cfg.Token = ""
|
|
cfg.Username = ""
|
|
cfg.LoginKind = ""
|
|
return saveConfig(path, cfg)
|
|
}
|