package secret import ( "fmt" "os" "path/filepath" ) // DetermineStateDir determines the state directory based on environment // variables and OS. // It returns an error if no usable directory can be determined. func DetermineStateDir(customConfigDir string) (string, error) { // Check for environment variable first if envStateDir := os.Getenv(EnvStateDir); envStateDir != "" { return envStateDir, nil } // Use custom config dir if provided if customConfigDir != "" { return filepath.Join(customConfigDir, AppID), nil } // Use os.UserConfigDir() which handles platform-specific directories: // - On Unix systems, it returns $XDG_CONFIG_HOME or $HOME/.config // - On Darwin, it returns $HOME/Library/Application Support // - On Windows, it returns %AppData% configDir, err := os.UserConfigDir() if err != nil { // Fallback to a reasonable default if we can't determine user config dir homeDir, homeErr := os.UserHomeDir() if homeErr != nil { return "", fmt.Errorf( "unable to determine state directory: config dir: %w, home dir: %w", err, homeErr) } fallbackDir := filepath.Join(homeDir, ".config", AppID) Warn("Could not determine user config directory, falling back to default", "fallback", fallbackDir, "error", err) return fallbackDir, nil } return filepath.Join(configDir, AppID), nil }