sba-scouting/rust/CLAUDE.md
Cal Corum defe741aba Fix stale screen count and standings description in CLAUDE.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 18:48:38 -06:00

2.7 KiB

CLAUDE.md — Rust Rewrite

Session Start

Read the rewrite memory file before starting work: ~/.claude/projects/-mnt-NV2-Development-sba-scouting/memory/rust-rewrite.md

It has the phase plan, completion status, architecture decisions, and current file layout.

Project Overview

Rust rewrite of the SBA Scout TUI. Uses ratatui + crossterm for the terminal UI, sqlx + SQLite for data, reqwest for API calls, and figment + TOML for configuration.

Commands

cargo build              # compile
cargo run                # run TUI
cargo test               # run tests
cargo clippy             # lint
cargo fmt                # format

Architecture

Same layered structure as the Python version, ported to Rust idioms:

src/
├── main.rs        # tokio runtime, event loop, file logging
├── app.rs         # App struct, screen routing, nav/status bars
├── config.rs      # figment-based TOML settings
├── lib.rs         # module re-exports
├── api/           # reqwest HTTP client, sync pipeline, CSV importers
├── calc/          # league stats, matchup scoring, score cache, weights
├── db/            # sqlx models, queries, schema
├── screens/       # ratatui screen states (all 7 screens complete)
└── widgets/       # reusable UI components (selector)

Key Patterns

  • Async throughout: tokio runtime, sqlx async, reqwest async
  • Message passing: mpsc::UnboundedSender<AppMessage> for async task → UI communication
  • No global state: Settings and SqlitePool passed by reference, no singletons
  • TOML config (not YAML): data/settings.toml with SBA_SCOUT_ env var overrides

Screens (all complete)

  • dashboard.rs — Roster summary, sync trigger
  • gameday.rs — Matchup table + lineup builder (opponent/pitcher context)
  • roster.rs — Tabbed roster view (Majors/Minors/IL), batter/pitcher sub-tables
  • matchup.rs — Standalone matchup analysis with sort modes, state cached on nav-away
  • lineup.rs — Standalone lineup builder, save/load/delete with confirmation
  • settings.rs — Config form with TOML save, live team validation, per-field change indicators
  • standings.rs — League standings with Division and Wild Card tabs, DB-cached with background API refresh

Code Style

  • Run cargo fmt and cargo clippy before committing
  • A cargo check hook runs automatically after every .rs file edit (via .claude/settings.json). Run cargo clippy manually at logical checkpoints (before commits, after finishing a feature, after a batch of edits) to catch lint warnings beyond compile errors.
  • Screen pattern: state struct → new()mount()handle_key()handle_message()render()