From c220702eef49d1762b91502f1dbf486e1fc81d0c Mon Sep 17 00:00:00 2001 From: David Gay Date: Sat, 14 Oct 2023 18:44:13 -0400 Subject: Improve class data loading --- src/main.rs | 19 +++++-------------- src/random_tables.rs | 5 ++--- src/rules/classes.rs | 22 ++++++++-------------- 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/src/main.rs b/src/main.rs index e2c46ac..5f50fa7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,10 @@ -use lazy_static::lazy_static; - use dmn::dice; use dmn::random_tables::RandomTables; -use dmn::rules::classes::Classes; +use dmn::rules::classes::CLASSES; use dmn::rules::npcs::Npc; mod cli; -lazy_static! { - static ref CLASSES: Classes = Classes::new().expect("Failed to load classes."); -} - fn main() { let matches = cli::cli().get_matches(); let random_tables = RandomTables::new().expect("Failed to load random tables."); @@ -21,13 +15,10 @@ fn main() { match random_command { ("henchman", _) => { let class_name = random_tables.roll_table("henchman_class").to_string(); - let class_ref = match CLASSES.class(&class_name) { - Ok(class_ref) => class_ref, - Err(err) => { - eprintln!("Error: {}", err); - std::process::exit(1); - } - }; + let class_ref = CLASSES.get(&*class_name).unwrap_or_else(|| { + eprintln!("Class '{}' not found.", &*class_name); + std::process::exit(1); + }); let npc = Npc::new( Some(random_tables.roll_table("npc_alignment")), Some(random_tables.roll_table("henchman_race")), diff --git a/src/random_tables.rs b/src/random_tables.rs index 07f0022..4411675 100644 --- a/src/random_tables.rs +++ b/src/random_tables.rs @@ -1,5 +1,5 @@ use crate::dice; -use crate::rules::classes::Classes; +use crate::rules::classes::CLASSES; use include_dir::{include_dir, Dir}; use serde::Deserialize; use serde_yaml; @@ -71,9 +71,8 @@ impl RandomTables { } if let Some(class_string) = &step.class { - let classes = Classes::new().unwrap(); let class = - classes.class(class_string).expect("Failed to load class."); + CLASSES.get(class_string).expect("Failed to load class."); output_text.push_str(&*class.name); } diff --git a/src/rules/classes.rs b/src/rules/classes.rs index cc827f0..75fdf5c 100644 --- a/src/rules/classes.rs +++ b/src/rules/classes.rs @@ -2,8 +2,9 @@ use crate::rules::ability_scores::AbilityScore; use serde::Deserialize; use serde_yaml; use std::collections::HashMap; -use std::error::Error; +use std::hash::Hash; // use std::fmt; +use lazy_static::lazy_static; use std::string::String; #[derive(Deserialize)] @@ -20,22 +21,15 @@ pub struct NpcAbilityScoreModifier { pub modifier: i32, } -const CLASSES_YAML: &str = include_str!("../data/rules/classes.yaml"); - -pub struct Classes { - classes: HashMap, +lazy_static! { + pub static ref CLASSES: HashMap = load_classes(); } -impl Classes { - pub fn new() -> Result> { - let classes: HashMap = serde_yaml::from_str(CLASSES_YAML)?; - Ok(Classes { classes }) - } - - pub fn class(&self, class_name: &str) -> Result<&Class, &'static str> { - self.classes.get(class_name).ok_or("Class not found.") - } +fn load_classes() -> HashMap { + let yaml_data = include_str!("../data/rules/classes.yaml"); + serde_yaml::from_str(yaml_data).expect("Failed to parse classes YAML") } + // // impl fmt::Display for Class { // fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -- cgit v1.2.3