Files

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)
}