claude-memory/graph/decisions/sba-scout-rust-rewrite-phase-2-complete-api-client-sync-and-4dc83e.md

2.0 KiB

id type title tags importance confidence created updated
4dc83eed-b0b1-4924-b82e-faf352426785 decision SBA Scout Rust rewrite Phase 2 complete — API client, sync, and CSV importers
sba-scout
rust
migration
phase-2
reqwest
api
csv
serde
0.8 0.8 2026-02-28T04:57:59.820017+00:00 2026-02-28T04:57:59.820017+00:00

SBA Scout Rust Rewrite — Phase 2 Complete

Phase 2 (API Client + Sync + CSV Import) committed as 3c70ecc on branch feat/rust-rewrite. 1,580 lines across 6 files.

Files Implemented

  • api/types.rs (175 lines): Serde response types with #[serde(rename)] for API field mismatches (snameshort_name, waraswar, gmidgm_discord_id, etc.)
  • api/client.rs (225 lines): ApiError enum (Http/CloudflareBlocked/Request/Parse) + LeagueApiClient with core get<T>() and 10 endpoint methods
  • api/sync.rs (243 lines): sync_teams (INSERT OR REPLACE), sync_players (ON CONFLICT omitting hand to preserve CSV data), sync_transactions (ON CONFLICT on composite key), sync_all orchestrator
  • api/importer.rs (666 lines): parse_float/parse_int/parse_endurance helpers, import_batter_cards (30+ column mapping), import_pitcher_cards (different header names, endurance parsing), import_all_cards (resilient — tries both CSVs independently)

Key Decisions

  • Serde rename: #[serde(rename = "...")] handles API field name mismatches at deserialization layer — cleaner than manual mapping
  • sync_players ON CONFLICT: Uses DO UPDATE SET ... (excluding hand column) to preserve hand data from CSV imports while updating all other fields from API
  • import_all_cards resilience: Doesn't abort if one CSV is missing — tries both independently so partial data is still loaded
  • response.text() + serde_json::from_str(): Used instead of response.json() to properly populate ApiError::Parse(serde_json::Error) variant (see related fix memory)

Relates To

  • Phase 1 decision: c9add129 (foundation layer — DB schema, queries, config)
  • Branch: feat/rust-rewrite