diff --git a/.gitignore b/.gitignore index ea8c4bf..a727c0a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +/data diff --git a/src/compile_data.rs b/src/compile_data.rs new file mode 100644 index 0000000..97855b1 --- /dev/null +++ b/src/compile_data.rs @@ -0,0 +1,81 @@ +use std::str::FromStr; + +use crate::raw_data::RawJobStats; + +#[derive(Debug)] +pub enum Role { + Tank, + Healer, + Doh, + Dol, + Dps(DpsRole), +} + +#[derive(Debug)] +pub enum DpsRole { + Melee, + Ranged, + Magic, +} + +#[derive(Debug)] +pub struct JobStats { + pub role: Role, + pub is_blue_mage: bool, + pub level: u8, + pub starting_level: u8, + pub name: String, +} + +fn get_starting_level(name: &str) -> anyhow::Result { + match name { + "Paladin" | "Warrior" | "Monk" | "Dragoon" | "Ninja" | "White Mage" | "Scholar" + | "Black Mage" | "Bard" | "Summoner" | "Blue Mage" | "Carpenter" | "Blacksmith" + | "Armorer" | "Goldsmith" | "Leatherworker" | "Weaver" | "Alchemist" | "Culinarian" + | "Miner" | "Botanist" | "Fisher" => Ok(0), + "Dark Knight" | "Astrologian" | "Machinist" => Ok(30), + "Gunbreaker" | "Dancer" => Ok(60), + "Samurai" | "Red Mage" => Ok(50), + "Reaper" | "Sage" => Ok(70), + _ => Err(anyhow::anyhow!("That's not a class")), + } +} + +impl From for JobStats { + fn from(raw: RawJobStats) -> Self { + let name = raw.unlocked_state.name; + JobStats { + role: str::parse(&name).unwrap(), + is_blue_mage: name == "Blue Mage", + starting_level: get_starting_level(&name).unwrap(), + level: raw.level, + name, + } + } +} + +impl FromStr for Role { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + use DpsRole::*; + use Role::*; + + match s { + "Paladin" | "Warrior" | "Dark Knight" | "Gunbreaker" => Ok(Tank), + "Monk" | "Dragoon" | "Ninja" | "Samurai" | "Reaper" => Ok(Dps(Melee)), + "White Mage" | "Scholar" | "Astrologian" | "Sage" => Ok(Healer), + "Bard" | "Machinist" | "Dancer" => Ok(Dps(Ranged)), + "Black Mage" => Ok(Dps(Magic)), + "Summoner" => Ok(Dps(Magic)), + "Red Mage" => Ok(Dps(Magic)), + "Blue Mage" => Ok(Dps(Magic)), + "Carpenter" | "Blacksmith" | "Armorer" | "Goldsmith" | "Leatherworker" | "Weaver" + | "Alchemist" | "Culinarian" => Ok(Doh), + "Miner" | "Botanist" | "Fisher" => Ok(Dol), + _ => Err(anyhow::anyhow!( + "Ooopsie Poopsie, dats not a weal cwass >.<" + )), + } + } +} diff --git a/src/main.rs b/src/main.rs index 04f9b93..3edc105 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,22 @@ +mod compile_data; mod raw_data; -use crate::raw_data::JobStats; + +use crate::compile_data::JobStats; +use crate::raw_data::RawJobStats; use std::fs::File; -fn main() -> anyhow::Result<()> { - let raw: Vec = serde_json::from_reader(File::open("./29932586.json")?)?; +fn get_job_stats(lodestone_id: usize) -> anyhow::Result> { + let file = File::open(format!("./data/{lodestone_id}.json"))?; + let raw: Vec = serde_json::from_reader(file)?; - println!("{raw:#?}"); + Ok(raw.into_iter().map(|r| r.into()).collect()) +} + +fn main() -> anyhow::Result<()> { + let stats = get_job_stats(29932586)?; + + println!("{stats:#?}"); Ok(()) } diff --git a/src/raw_data.rs b/src/raw_data.rs index 2a8c3f5..6e799ef 100644 --- a/src/raw_data.rs +++ b/src/raw_data.rs @@ -1,7 +1,7 @@ use serde::Deserialize; #[derive(Deserialize, Debug)] -pub struct JobStats { +pub struct RawJobStats { // TODO: is specialized #[serde(rename = "Level")] pub level: u8,