yog_registry/
tool_levels.rs1use std::sync::LazyLock;
6
7#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
10pub struct LevelTag {
11 pub tag: String,
12 #[data(default)]
13 pub when: String,
14}
15
16#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
18pub struct ToolLevel {
19 pub id: String,
21 pub incorrect: String,
23 pub needs: Vec<LevelTag>,
25}
26
27#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
29pub struct AboveTop {
30 pub needs: Vec<LevelTag>,
31 pub caveat: String,
33}
34
35#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
37pub struct ToolLadder {
38 pub ladder: String,
40 pub incorrect_when: String,
42 pub levels: Vec<ToolLevel>,
44 pub above: AboveTop,
45}
46
47static TOOL_LADDER: LazyLock<ToolLadder> = LazyLock::new(|| {
48 yog_data::from_text::<ToolLadder>(include_str!("../assets/tool_levels.ydata"))
49 .unwrap_or_else(|e| panic!("yog-registry's tool levels: {e}"))
50 .value
51});
52
53impl ToolLadder {
54 pub fn game() -> &'static ToolLadder {
56 &TOOL_LADDER
57 }
58
59 pub fn level(&self, name: &str) -> Option<&ToolLevel> {
61 let id = yog_ids::qualify(name);
62 self.levels.iter().find(|l| l.id == id)
63 }
64
65 pub fn ids(&self) -> impl Iterator<Item = &str> {
67 self.levels.iter().map(|l| l.id.as_str())
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[test]
76 fn the_game_ladder_reads() {
77 let l = ToolLadder::game();
78 assert_eq!(l.ids().collect::<Vec<_>>(), ["minecraft:wood", "minecraft:stone", "minecraft:iron", "minecraft:diamond", "minecraft:netherite"]);
79 assert_eq!(l.level("iron").unwrap().needs[0].tag, "minecraft:needs_iron_tool");
80 assert!(l.above.needs.iter().any(|t| t.when == "fabric/1.20"));
81 }
82}