diff options
author | Daniel Schadt <kingdread@gmx.de> | 2020-04-28 12:11:29 +0200 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2020-04-28 12:12:56 +0200 |
commit | 134c9eb670095210672ec125c2df755fe7ec341e (patch) | |
tree | 4eae10de1d67446fdd3e0b07288c9f7487df531a /src/lib.rs | |
parent | 4193165476a05fb4b07849c5371af3c8b328d6cb (diff) | |
download | evtclib-134c9eb670095210672ec125c2df755fe7ec341e.tar.gz evtclib-134c9eb670095210672ec125c2df755fe7ec341e.tar.bz2 evtclib-134c9eb670095210672ec125c2df755fe7ec341e.zip |
add Profession and EliteSpec enum
In the high-level "Player" struct, dealing with the low-level numbers
seems a bit off, especially because it means that applications have to
keep a table of id-to-profession mappings anyway. We're already
including a Boss enum for the same reasons, so we might as well include
Profession and EliteSpec data - which is also not changing as frequently
as Boss.
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -20,6 +20,7 @@ use std::marker::PhantomData; use getset::{CopyGetters, Getters}; +use num_traits::FromPrimitive; use thiserror::Error; pub mod raw; @@ -28,12 +29,16 @@ mod event; pub use event::{Event, EventKind}; pub mod gamedata; -pub use gamedata::Boss; +pub use gamedata::{Boss, EliteSpec, Profession}; #[derive(Error, Debug)] pub enum EvtcError { #[error("invalid data has been provided")] InvalidData, + #[error("invalid profession id: {0}")] + InvalidProfession(u32), + #[error("invalid elite specialization id: {0}")] + InvalidEliteSpec(u32), #[error("utf8 decoding error: {0}")] Utf8Error(#[from] std::string::FromUtf8Error), } @@ -43,11 +48,11 @@ pub enum EvtcError { pub struct Player { /// The player's profession. #[get_copy = "pub"] - profession: u32, + profession: Profession, - /// The player's elite specialization. + /// The player's elite specialization, if any is equipped. #[get_copy = "pub"] - elite: u32, + elite: Option<EliteSpec>, character_name: String, @@ -298,9 +303,18 @@ impl Agent { .take_while(|c| *c != 0) .collect::<Vec<_>>(); let third = raw_agent.name[first.len() + second.len() + 2] - b'0'; + let elite = if raw_agent.is_elite == 0 { + None + } else { + Some( + EliteSpec::from_u32(raw_agent.is_elite) + .ok_or(EvtcError::InvalidEliteSpec(raw_agent.is_elite))?, + ) + }; AgentKind::Player(Player { - profession: raw_agent.prof, - elite: raw_agent.is_elite, + profession: Profession::from_u32(raw_agent.prof) + .ok_or(EvtcError::InvalidProfession(raw_agent.prof))?, + elite, character_name: String::from_utf8(first)?, account_name: String::from_utf8(second)?, subgroup: third, |