use cardpack::prelude::{BasicPile, Pile, Standard52};
use serde::{Deserialize, Deserializer, Serializer};
pub fn serialize_basic_pile<S>(pile: &BasicPile, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&pile.to_string())
}
pub fn deserialize_basic_pile<'de, D>(deserializer: D) -> Result<BasicPile, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
let pile = s
.parse::<Pile<Standard52>>()
.map_err(serde::de::Error::custom)?;
Ok(pile.into_basic_pile())
}
pub fn serialize_basic_pile_opt<S>(
pile: &Option<BasicPile>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match pile {
Some(p) => serializer.serialize_str(&p.to_string()),
None => serializer.serialize_none(),
}
}
pub fn deserialize_basic_pile_opt<'de, D>(deserializer: D) -> Result<Option<BasicPile>, D::Error>
where
D: Deserializer<'de>,
{
let opt = Option::<String>::deserialize(deserializer)?;
match opt {
Some(s) => s
.parse::<Pile<Standard52>>()
.map(|p| p.into_basic_pile())
.map(Some)
.map_err(serde::de::Error::custom),
None => Ok(None),
}
}