serde impl #16
Generated
+2
@@ -132,6 +132,8 @@ version = "0.3.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"card_game",
|
"card_game",
|
||||||
"rand",
|
"rand",
|
||||||
|
"serde",
|
||||||
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
@@ -6,6 +6,12 @@ edition = "2024"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
card_game.workspace = true
|
card_game.workspace = true
|
||||||
rand = { version = "0.10.1", default-features = false, features = ["std_rng"] }
|
rand = { version = "0.10.1", default-features = false, features = ["std_rng"] }
|
||||||
|
serde = { version = "1.0.228", default-features = false, optional = true }
|
||||||
|
serde_derive = { version = "1.0.228", default-features = false, optional = true }
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["serde"]
|
||||||
|
serde = ["dep:serde", "dep:serde_derive"]
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ use card_game::{Card, Game, Pile, Rank, Stack};
|
|||||||
#[cfg(doctest)]
|
#[cfg(doctest)]
|
||||||
struct ReadmeDoctests;
|
struct ReadmeDoctests;
|
||||||
|
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde_derive::Deserialize, serde_derive::Serialize)
|
||||||
|
)]
|
||||||
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
||||||
pub enum DrawStockConfig {
|
pub enum DrawStockConfig {
|
||||||
#[default]
|
#[default]
|
||||||
@@ -14,6 +18,10 @@ pub enum DrawStockConfig {
|
|||||||
DrawThree = 3,
|
DrawThree = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde_derive::Deserialize, serde_derive::Serialize)
|
||||||
|
)]
|
||||||
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
||||||
pub enum MoveFromFoundationConfig {
|
pub enum MoveFromFoundationConfig {
|
||||||
#[default]
|
#[default]
|
||||||
@@ -21,6 +29,10 @@ pub enum MoveFromFoundationConfig {
|
|||||||
Disallowed,
|
Disallowed,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde_derive::Deserialize, serde_derive::Serialize)
|
||||||
|
)]
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct ScoringConfig {
|
pub struct ScoringConfig {
|
||||||
pub move_to_foundation: i32,
|
pub move_to_foundation: i32,
|
||||||
@@ -44,6 +56,10 @@ impl Default for ScoringConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde_derive::Deserialize, serde_derive::Serialize)
|
||||||
|
)]
|
||||||
#[derive(Clone, Debug, Default)]
|
#[derive(Clone, Debug, Default)]
|
||||||
pub struct KlondikeConfig {
|
pub struct KlondikeConfig {
|
||||||
pub draw_stock: DrawStockConfig,
|
pub draw_stock: DrawStockConfig,
|
||||||
@@ -379,6 +395,10 @@ const fn sum(n: usize) -> usize {
|
|||||||
const STOCK: usize = 52 - sum(TABLEAUS);
|
const STOCK: usize = 52 - sum(TABLEAUS);
|
||||||
const NUM_RANKS: usize = Rank::RANKS.len();
|
const NUM_RANKS: usize = Rank::RANKS.len();
|
||||||
|
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde_derive::Deserialize, serde_derive::Serialize)
|
||||||
|
)]
|
||||||
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
pub struct KlondikeState {
|
pub struct KlondikeState {
|
||||||
stock: Pile<STOCK, STOCK>,
|
stock: Pile<STOCK, STOCK>,
|
||||||
@@ -613,6 +633,10 @@ fn test_klondike_iter() {
|
|||||||
assert_eq!(KlondikeIter::new().count(), 721);
|
assert_eq!(KlondikeIter::new().count(), 721);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde_derive::Deserialize, serde_derive::Serialize)
|
||||||
|
)]
|
||||||
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
pub struct Klondike {
|
pub struct Klondike {
|
||||||
state: KlondikeState,
|
state: KlondikeState,
|
||||||
@@ -797,3 +821,28 @@ impl Game for Klondike {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
impl serde::Serialize for KlondikeInstruction {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: serde::Serializer,
|
||||||
|
{
|
||||||
|
// There is 721 klondike instructions
|
||||||
|
let instruction_id = KlondikeIter::new()
|
||||||
|
.position(|instruction| &instruction == self)
|
||||||
|
.unwrap();
|
||||||
|
serializer.serialize_u16(instruction_id as u16)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
impl<'de> serde::Deserialize<'de> for KlondikeInstruction {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let instruction_id = u16::deserialize(deserializer)?;
|
||||||
|
let instruction = KlondikeIter::new().nth(instruction_id as usize).unwrap();
|
||||||
|
Ok(instruction)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user