all repos

smutok @ cadefa6

yet another tui rss reader (not abandoned, just paused development)
3 files changed, 50 insertions(+), 18 deletions(-)
feat: prep for tui
Author: Oleksandr Smirnov olexsmir@gmail.com
Committed at: 2025-12-26 20:15:29 +0200
Change ID: xxymstsvolnpuxzzwmlpulmlvrxkxkko
Parent: ba3c93e
M app.go

@@ -3,8 +3,8 @@

import ( "context" "errors" - "fmt" "log/slog" + "os" "olexsmir.xyz/smutok/internal/config" "olexsmir.xyz/smutok/internal/freshrss"

@@ -19,10 +19,16 @@ freshrssSyncer *freshrss.Syncer

freshrssWorker *freshrss.Worker } -func bootstrap(ctx context.Context) (*app, error) { +func bootstrap(ctx context.Context, outputToFile bool) (*app, error) { cfg, err := config.New() if err != nil { return nil, err + } + + if outputToFile { + if lerr := setupLogger(cfg); lerr != nil { + return nil, lerr + } } store, err := store.NewSQLite(cfg.DBPath)

@@ -106,3 +112,13 @@ }

return token, nil } + +func setupLogger(cfg *config.Config) error { + file, err := os.OpenFile(cfg.LogFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o666) + if err != nil { + return err + } + logger := slog.New(slog.NewTextHandler(file, nil)) + slog.SetDefault(logger) + return nil +}
M internal/tui/tui.go

@@ -1,15 +1,37 @@

package tui -import tea "github.com/charmbracelet/bubbletea" +import ( + "context" + + tea "github.com/charmbracelet/bubbletea" + "olexsmir.xyz/smutok/internal/store" +) + +type Syncer interface { + Sync(ctx context.Context) error +} type Model struct { + ctx context.Context + isQutting bool showErr bool err error + + syncer Syncer + store *store.Sqlite } -func NewModel() *Model { - return &Model{} +func NewModel( + ctx context.Context, + syncer Syncer, + store *store.Sqlite, +) *Model { + return &Model{ + ctx: ctx, + syncer: syncer, + store: store, + } } func (m *Model) Init() tea.Cmd {
M main.go

@@ -6,11 +6,12 @@ _ "embed"

"fmt" "log/slog" "os" - "os/signal" "strings" + tea "github.com/charmbracelet/bubbletea" "github.com/urfave/cli/v3" "olexsmir.xyz/smutok/internal/config" + "olexsmir.xyz/smutok/internal/tui" ) //go:embed version

@@ -37,22 +38,15 @@ }

} func runTui(ctx context.Context, c *cli.Command) error { - app, err := bootstrap(ctx) + app, err := bootstrap(ctx, true) if err != nil { return err } - - ctx, cancel := context.WithCancel(ctx) - go func() { app.freshrssWorker.Run(ctx) }() - quitCh := make(chan os.Signal, 1) - signal.Notify(quitCh, os.Interrupt) - <-quitCh - - cancel() - - return nil + model := tui.NewModel(ctx, app.freshrssSyncer, app.store) + _, err = tea.NewProgram(model).Run() + return err } // sync

@@ -65,7 +59,7 @@ Action: syncFeeds,

} func syncFeeds(ctx context.Context, c *cli.Command) error { - app, err := bootstrap(ctx) + app, err := bootstrap(ctx, false) if err != nil { return err }