cremote/browser/storage.go

108 lines
2.2 KiB
Go

package browser
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"sync"
)
// TabStorage manages persistent storage of tab IDs
type TabStorage struct {
Tabs map[string]string // Maps tab IDs to their internal IDs
mu sync.Mutex
}
// NewTabStorage creates a new tab storage
func NewTabStorage() (*TabStorage, error) {
storage := &TabStorage{
Tabs: make(map[string]string),
}
// Load existing tabs from storage
err := storage.load()
if err != nil {
// If the file doesn't exist, that's fine - we'll create it
if !os.IsNotExist(err) {
return nil, fmt.Errorf("failed to load tab storage: %w", err)
}
}
return storage, nil
}
// SaveTab saves a tab ID to storage
func (s *TabStorage) SaveTab(tabID string) error {
s.mu.Lock()
defer s.mu.Unlock()
s.Tabs[tabID] = tabID
return s.save()
}
// GetTab gets a tab ID from storage
func (s *TabStorage) GetTab(tabID string) (string, bool) {
s.mu.Lock()
defer s.mu.Unlock()
internalID, exists := s.Tabs[tabID]
return internalID, exists
}
// RemoveTab removes a tab ID from storage
func (s *TabStorage) RemoveTab(tabID string) error {
s.mu.Lock()
defer s.mu.Unlock()
delete(s.Tabs, tabID)
return s.save()
}
// getStoragePath returns the path to the storage file
func getStoragePath() (string, error) {
homeDir, err := os.UserHomeDir()
if err != nil {
return "", fmt.Errorf("failed to get user home directory: %w", err)
}
// Create .cremote directory if it doesn't exist
storageDir := filepath.Join(homeDir, ".cremote")
err = os.MkdirAll(storageDir, 0755)
if err != nil {
return "", fmt.Errorf("failed to create storage directory: %w", err)
}
return filepath.Join(storageDir, "tabs.json"), nil
}
// load loads the tab storage from disk
func (s *TabStorage) load() error {
path, err := getStoragePath()
if err != nil {
return err
}
data, err := os.ReadFile(path)
if err != nil {
return err
}
return json.Unmarshal(data, &s.Tabs)
}
// save saves the tab storage to disk
func (s *TabStorage) save() error {
path, err := getStoragePath()
if err != nil {
return err
}
data, err := json.MarshalIndent(s.Tabs, "", " ")
if err != nil {
return fmt.Errorf("failed to marshal tab storage: %w", err)
}
return os.WriteFile(path, data, 0644)
}