use yog_sync::LazyLock;
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct LevelTag {
pub tag: String,
#[data(default)]
pub when: String,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
pub struct ToolLevel {
pub id: String,
pub incorrect: String,
pub needs: Vec<LevelTag>,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq, Default)]
pub struct AboveTop {
pub needs: Vec<LevelTag>,
pub caveat: String,
}
#[derive(yog_data::Schema, Debug, Clone, PartialEq, Default)]
pub struct ToolLadder {
pub ladder: String,
pub incorrect_when: String,
pub levels: Vec<ToolLevel>,
pub above: AboveTop,
}
static TOOL_LADDER: LazyLock<ToolLadder> = LazyLock::new(|| {
yog_data::built_in::<ToolLadder>(
"yog-registry's tool levels",
include_str!("../../assets/tool_levels.ydata"),
)
});
impl ToolLadder {
pub fn game() -> &'static ToolLadder {
&TOOL_LADDER
}
pub fn level(&self, name: &str) -> Option<&ToolLevel> {
let id = yog_ids::qualify(name);
self.levels.iter().find(|l| l.id == id)
}
pub fn ids(&self) -> impl Iterator<Item = &str> {
self.levels.iter().map(|l| l.id.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_game_ladder_reads() {
let l = ToolLadder::game();
assert_eq!(
l.ids().collect::<Vec<_>>(),
[
"minecraft:wood",
"minecraft:stone",
"minecraft:iron",
"minecraft:diamond",
"minecraft:netherite"
]
);
assert_eq!(
l.level("iron").unwrap().needs[0].tag,
"minecraft:needs_iron_tool"
);
assert!(l.above.needs.iter().any(|t| t.when == "fabric/1.20"));
}
}