refactor: consolidate card_to_id into solitaire_core
Build and Deploy / build-and-push (push) Failing after 1m21s
Web E2E / web-e2e (push) Failing after 3m27s

Three byte-identical copies of the stable 0..=51 card-id helper
(suit_index*13 + rank-1) lived in feedback_anim_plugin, radial_menu, and
solitaire_wasm. The WASM copy's own comment notes it MUST match the engine
for cross-platform replay parity — exactly the kind of invariant a single
source of truth should enforce.

Add `solitaire_core::card::card_to_id(&Card) -> u32` and have all three
call sites import it. No behaviour change (same formula).

cargo test --workspace and cargo clippy --workspace --all-targets -- -D warnings pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
funman300
2026-06-10 10:14:20 -07:00
parent cac77a54a6
commit 0d3f037672
4 changed files with 29 additions and 38 deletions
+3 -12
View File
@@ -87,18 +87,9 @@ pub struct CardSnapshot {
pub face_up: bool,
}
/// Stable 0..=51 identifier derived from suit and rank. Mirrors the desktop
/// engine's `card_to_id` so replay snapshots are identical across platforms
/// `Card` itself carries no id field (suit + rank are unique within a deck).
fn card_to_id(card: &solitaire_core::card::Card) -> u32 {
let suit_index = match card.suit() {
Suit::Clubs => 0,
Suit::Diamonds => 1,
Suit::Hearts => 2,
Suit::Spades => 3,
};
suit_index * 13 + (card.rank() as u32 - 1)
}
// Stable 0..=51 card identity, shared with the desktop engine via
// solitaire_core so replay snapshots are identical across platforms.
use solitaire_core::card::card_to_id;
impl From<&(solitaire_core::card::Card, bool)> for CardSnapshot {
fn from((card, face_up): &(solitaire_core::card::Card, bool)) -> Self {