First real commit. Setting up for full CI/CD and testing pipeline

This commit is contained in:
2026-11-04 22:30:59 +01:00
parent cbb843344e
commit e08c997914
26 changed files with 3561 additions and 198 deletions

121
app/app.go Normal file
View File

@@ -0,0 +1,121 @@
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
}