feat: add htsy CLI tool for Haitun private domain API
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user