use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type", content = "value")]
pub enum FaceValue {
#[serde(rename = "integer")]
Integer(i64),
#[serde(rename = "text")]
Text(String),
}
impl std::fmt::Display for FaceValue {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
FaceValue::Integer(n) => write!(f, "{n}"),
FaceValue::Text(s) => write!(f, "{s}"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default, Serialize, Deserialize)]
pub enum DieKind {
Builtin,
#[default]
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Die {
pub name: String,
pub faces: Vec<FaceValue>,
#[serde(default)]
pub kind: DieKind,
}
pub const CUSTOM_PREFIX: &str = "\u{273d}";
pub fn builtin_dice() -> Vec<Die> {
[4, 6, 8, 10, 12, 20, 100]
.into_iter()
.map(|n| Die {
name: format!("D{n}"),
faces: (1..=n).map(|i| FaceValue::Integer(i as i64)).collect(),
kind: DieKind::Builtin,
})
.collect()
}