use serde::Serialize;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize)]
#[serde(untagged, rename_all_fields = "camelCase")]
pub enum Rules {
Named(String),
Explicit {
ko: Ko,
scoring: Scoring,
tax: Tax,
suicide: bool,
has_button: bool,
white_handicap_bonus: Bonus,
friendly_pass_ok: bool,
},
}
macro_rules! rules {
($(#[$meta:meta])* $name:ident, $value:expr) => {
$(#[$meta])*
pub fn $name() -> Self {
Rules::Named($value.to_string())
}
};
}
impl Rules {
rules!(
japanese, "japanese"
);
rules!(
chinese, "chinese"
);
rules!(
chinese_ogs, "chinese-ogs"
);
rules!(
stone_scoring, "stone-scoring"
);
rules!(
ancient_territory, "ancient-territory"
);
rules!(
aga_button, "aga-button"
);
rules!(
aga, "aga"
);
rules!(
new_zealand, "new-zealand"
);
rules!(
tromp_taylor, "tromp-taylor"
);
rules!(
ing, "ing"
);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum Ko {
Simple,
Positional,
Situational,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum Scoring {
Area,
Territory,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum Tax {
None,
Seki,
All,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize)]
pub enum Bonus {
#[serde(rename = "0")]
Zero,
#[serde(rename = "N-1")]
NMinusOne,
N,
}