package config import ( "fmt" "os" "path/filepath" "gopkg.in/yaml.v3" ) // ClientConfig represents the client configuration type ClientConfig struct { Server string `yaml:"server"` // Server address (e.g., tunnel.example.com:443) Token string `yaml:"token"` // Authentication token TLS bool `yaml:"tls"` // Use TLS (always true for production) } // DefaultClientConfig returns the default configuration path func DefaultClientConfigPath() string { home, err := os.UserHomeDir() if err != nil { return ".drip/config.yaml" } return filepath.Join(home, ".drip", "config.yaml") } // LoadClientConfig loads configuration from file func LoadClientConfig(path string) (*ClientConfig, error) { if path == "" { path = DefaultClientConfigPath() } data, err := os.ReadFile(path) if err != nil { if os.IsNotExist(err) { return nil, fmt.Errorf("config file not found at %s, please run 'drip config init' first", path) } return nil, fmt.Errorf("failed to read config file: %w", err) } var config ClientConfig if err := yaml.Unmarshal(data, &config); err != nil { return nil, fmt.Errorf("failed to parse config file: %w", err) } // Validate required fields if config.Server == "" { return nil, fmt.Errorf("server address is required in config") } return &config, nil } // SaveClientConfig saves configuration to file func SaveClientConfig(config *ClientConfig, path string) error { if path == "" { path = DefaultClientConfigPath() } // Create directory if not exists dir := filepath.Dir(path) if err := os.MkdirAll(dir, 0700); err != nil { return fmt.Errorf("failed to create config directory: %w", err) } // Marshal to YAML data, err := yaml.Marshal(config) if err != nil { return fmt.Errorf("failed to marshal config: %w", err) } // Write to file with secure permissions if err := os.WriteFile(path, data, 0600); err != nil { return fmt.Errorf("failed to write config file: %w", err) } return nil } // ConfigExists checks if config file exists func ConfigExists(path string) bool { if path == "" { path = DefaultClientConfigPath() } _, err := os.Stat(path) return err == nil }