122 lines
2.2 KiB
Go
122 lines
2.2 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"sync"
|
|
|
|
"fast_reader/internal/reader"
|
|
"fast_reader/internal/settings"
|
|
"fast_reader/internal/storage"
|
|
)
|
|
|
|
type App struct {
|
|
ctx context.Context
|
|
mu sync.RWMutex
|
|
settings settings.Settings
|
|
settingsPath string
|
|
}
|
|
|
|
func NewApp() *App {
|
|
return &App{
|
|
settings: settings.Default(),
|
|
}
|
|
}
|
|
|
|
func (a *App) Startup(ctx context.Context) {
|
|
a.ctx = ctx
|
|
|
|
configDir, err := os.UserConfigDir()
|
|
if err != nil {
|
|
log.Printf("Could not locate user config directory: %v", err)
|
|
return
|
|
}
|
|
|
|
a.mu.Lock()
|
|
defer a.mu.Unlock()
|
|
|
|
a.settingsPath = filepath.Join(
|
|
configDir,
|
|
"fast_reader",
|
|
"settings.json",
|
|
)
|
|
|
|
var saved settings.Settings
|
|
|
|
err = storage.Load(a.settingsPath, &saved)
|
|
|
|
if err != nil {
|
|
if !os.IsNotExist(err) {
|
|
log.Printf("Could not load settings: %v", err)
|
|
}
|
|
|
|
a.settings = settings.Default()
|
|
return
|
|
}
|
|
|
|
a.settings = saved.Normalize()
|
|
|
|
log.Println("Settings loaded successfully")
|
|
}
|
|
|
|
// PrepareText converts pasted text into a sequence of words
|
|
// ready for RSVP playback.
|
|
func (a *App) PrepareText(text string) []reader.Word {
|
|
return reader.Tokenize(text)
|
|
}
|
|
|
|
// GetVersion returns the application version.
|
|
func (a *App) GetVersion() string {
|
|
return "0.1.0"
|
|
}
|
|
|
|
// GetSettings returns the current application settings.
|
|
func (a *App) GetSettings() settings.Settings {
|
|
a.mu.RLock()
|
|
defer a.mu.RUnlock()
|
|
|
|
return a.settings
|
|
}
|
|
|
|
// SaveSettings validates and persists application settings.
|
|
func (a *App) SaveSettings(input settings.Settings) error {
|
|
normalized := input.Normalize()
|
|
|
|
a.mu.Lock()
|
|
defer a.mu.Unlock()
|
|
|
|
if a.settingsPath == "" {
|
|
configDir, err := os.UserConfigDir()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
a.settingsPath = filepath.Join(
|
|
configDir,
|
|
"fast_reader",
|
|
"settings.json",
|
|
)
|
|
}
|
|
|
|
if err := storage.Save(a.settingsPath, normalized); err != nil {
|
|
return err
|
|
}
|
|
|
|
a.settings = normalized
|
|
|
|
return nil
|
|
}
|
|
|
|
// ResetSettings restores and persists the default settings.
|
|
func (a *App) ResetSettings() (settings.Settings, error) {
|
|
defaults := settings.Default()
|
|
|
|
if err := a.SaveSettings(defaults); err != nil {
|
|
return settings.Settings{}, err
|
|
}
|
|
|
|
return defaults, nil
|
|
}
|