use std::sync::Arc;
use crate::cards::{
card::{Card, CardData},
deck::{Deck, DeckConfig},
meld::{Meld, Run, Set},
suit_rank::{Rank, Suit},
};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
pub(super) struct SerializableSet {
cards: Vec<CardData>,
set_rank: Rank,
}
#[derive(Serialize, Deserialize)]
pub(super) struct SerializableRun {
cards: Vec<CardData>,
set_suit: Suit,
}
#[derive(Serialize, Deserialize)]
pub(super) enum SerializableMeld {
Set(SerializableSet),
Run(SerializableRun),
}
impl SerializableMeld {
pub fn into_meld(self, deck_config: Arc<DeckConfig>) -> Meld {
match self {
Self::Set(set) => {
let cards = set
.cards
.into_iter()
.map(|c| Card {
rank: c.rank,
suit: c.suit,
deck_config: deck_config.clone(),
})
.collect();
let set = Set {
cards,
set_rank: set.set_rank,
};
Meld::Set(set)
}
Self::Run(run) => {
let cards = run
.cards
.into_iter()
.map(|c| Card {
rank: c.rank,
suit: c.suit,
deck_config: deck_config.clone(),
})
.collect();
let run = Run {
cards,
set_suit: run.set_suit,
};
Meld::Run(run)
}
}
}
pub fn from_meld(meld: &Meld) -> Self {
match meld {
Meld::Run(run) => {
let cards = run.cards.iter().map(|c| c.data()).collect();
let run = SerializableRun {
cards,
set_suit: run.set_suit,
};
Self::Run(run)
}
Meld::Set(set) => {
let cards = set.cards.iter().map(|c| c.data()).collect();
let set = SerializableSet {
cards,
set_rank: set.set_rank,
};
Self::Set(set)
}
}
}
}
#[derive(Serialize, Deserialize)]
pub(super) struct SerializableDeck {
pub stock: Vec<CardData>,
pub discard_pile: Vec<CardData>,
}
impl SerializableDeck {
pub fn into_deck(self, deck_config: Arc<DeckConfig>) -> Deck {
let stock = self
.stock
.into_iter()
.map(|c| Card::from_card_data(c, deck_config.clone()))
.collect();
let discard_pile = self
.discard_pile
.into_iter()
.map(|c| Card::from_card_data(c, deck_config.clone()))
.collect();
Deck {
stock,
discard_pile,
config: deck_config,
}
}
pub fn from_deck(deck: &Deck) -> Self {
let stock = deck.stock.iter().map(|c| c.data()).collect();
let discard_pile = deck.discard_pile.iter().map(|c| c.data()).collect();
Self {
stock,
discard_pile,
}
}
}