FRE-680: Initial project scaffold with auth & API client
- Set up Go module with Cobra CLI skeleton - Implemented login/logout/session commands with 2FA support - Created ProtonMail API client with rate limiting - Added config management for ~/.config/pop/ - Configured CI/CD pipeline with GitHub Actions - Added Makefile for build/test/lint targets Files: - main.go, go.mod, go.sum - cmd/root.go, cmd/auth.go - internal/auth/session.go - internal/config/config.go - internal/api/client.go - Makefile, README.md, .gitignore - .github/workflows/ci.yml
This commit is contained in:
78
internal/config/config.go
Normal file
78
internal/config/config.go
Normal file
@@ -0,0 +1,78 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
APIBaseURL string `json:"api_base_url"`
|
||||
TimeoutSec int `json:"timeout_sec"`
|
||||
RateLimitReq int `json:"rate_limit_requests"`
|
||||
RateLimitWin int `json:"rate_limit_window_sec"`
|
||||
}
|
||||
|
||||
type ConfigManager struct {
|
||||
configDir string
|
||||
configFile string
|
||||
}
|
||||
|
||||
func NewConfigManager() *ConfigManager {
|
||||
homeDir, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
homeDir = "~"
|
||||
}
|
||||
|
||||
configDir := filepath.Join(homeDir, ".config", "pop")
|
||||
return &ConfigManager{
|
||||
configDir: configDir,
|
||||
configFile: filepath.Join(configDir, "config.json"),
|
||||
}
|
||||
}
|
||||
|
||||
func (m *ConfigManager) ConfigDir() string {
|
||||
return m.configDir
|
||||
}
|
||||
|
||||
func (m *ConfigManager) Load() (*Config, error) {
|
||||
defaultConfig := &Config{
|
||||
APIBaseURL: "https://api.protonmail.ch",
|
||||
TimeoutSec: 30,
|
||||
RateLimitReq: 100,
|
||||
RateLimitWin: 60,
|
||||
}
|
||||
|
||||
data, err := os.ReadFile(m.configFile)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return defaultConfig, nil
|
||||
}
|
||||
return nil, fmt.Errorf("failed to read config: %w", err)
|
||||
}
|
||||
|
||||
var config Config
|
||||
if err := json.Unmarshal(data, &config); err != nil {
|
||||
return nil, fmt.Errorf("failed to parse config: %w", err)
|
||||
}
|
||||
|
||||
return &config, nil
|
||||
}
|
||||
|
||||
func (m *ConfigManager) Save(config *Config) error {
|
||||
if err := os.MkdirAll(m.configDir, 0755); err != nil {
|
||||
return fmt.Errorf("failed to create config dir: %w", err)
|
||||
}
|
||||
|
||||
data, err := json.MarshalIndent(config, "", " ")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to marshal config: %w", err)
|
||||
}
|
||||
|
||||
if err := os.WriteFile(m.configFile, data, 0600); err != nil {
|
||||
return fmt.Errorf("failed to write config file: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user